簡體   English   中英

如何定義聚合的一對多關系

[英]How to define aggregate one-to-many relationship

我有兩個聚合BlogPost具有一對多的關系( Blog與幾個Post相關)。 根據領域驅動設計最佳實踐,我不確定Blog是否應該包含一系列Post參考:

public class Blog : Entity<BlogId>, IAggregateRoot
{
    IEnumerable<Post> posts;
}

Post還通過BlogId具有間接 id 引用時:

public class Post : Entity<PostId>, IAggregateRoot
{
    BlogId BlogId;
}

如果需要更多上下文來回答問題,請告訴我。

在 Vaughn Vernon 所著的《實現領域驅動設計》一書中,您可以找到一整章介紹如何定義聚合以及可以應用的一些經驗法則。

其中之一是盡量保持你的聚合盡可能小。 在您的情況下,我會選擇避免您的博客 object 中包含 Post 對象列表。 想象一下,您的博客 object 有一個屬性name ,而您只想更改它:當您將從數據庫中檢索該 object 時,如果它包含所有帖子,您也會檢索它們,從而為您的用例創建不必要的連接正在努力,這將降低性能。

從設計的角度來看,Blog 可能不是由它的 Post 定義的,所以實際上你不需要它們在里面。 聚合應該負責其所有不變規則(業務邏輯規則),僅此而已。

我的建議是讓它盡可能簡單,並始終專注於堅實的原則。

祝你好運!

DDD 不會告訴您如何實現您的應用程序,而只是為您提供指導。 將“帖子”列表保存到“博客”class 和邏輯反向引用絕對可以,如果您不能做其他事情,但最重要的是要了解“博客用戶”將如何對帖子采取行動。

因此,請隨意以您最喜歡的方式實現域 model,但添加帖子、刪除帖子等的唯一方法是通過發送到“博客”實體的命令,這樣博客本身就會授予您這些帖子根據您的實施正確連接

聚合的規則是您應該通過聚合根 ID 引用聚合,因此在博客聚合中您應該保留一個帖子 ID 列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM