是的,深層次結構在DDD中很好。
難道我最終會得到一個非常廣泛的聚合? - 如果現實情況非常複雜,並且您的領域模型儘可能最好,那麼您最終將得到一個複雜的聚合根。
是的,Form
應該是聚合根。
所有其他對象應該是值對象 - 錯誤的,所有其他對象應該是非聚合根實體(帶Id),而不需要存儲庫來獲取它們。值對象沒有Id,並且值對等的對象僅由其屬性值確定,而不是通過Ids平等確定(更多信息here)。
在這種情況下FormRepository將各種CRUD方法子對象被堆滿 - 不,一個存儲庫應該只包含關於聚合根的方法,即Get<T> , Save<T> where T : IAggregateRoot
,一旦你得到一個聚合根的實例,可以遍歷通過屬性和方法來獲得你所需要的。例如:
var formId = 23;
var form = _formRepository.Get(formId);
var firstGroup = form.Sections.First().Group().First();
或更好
var groupIndex = 1;
var firstGroup = form.GetGroupAt(groupIndex);
其中
public Group GetGroupAt(int groupIndex)
{
Sections.First().Group().ElementAt(groupIndex);
}
我相信這樣的表現很容易導致性能問題 - 如果你使用CQRS,你會被調用一些Form
域命令處理程序的方法,如果你使用NHibernate的實體持久性,它將通過默認t使用延遲加載,並且只會從數據庫加載Form
,然後它只會加載您真正觸及的實體,因此例如Sections.First()
會加載數據庫中的所有部分,但不加載組以及其餘部分。查詢時,您需要創建一個FormDto
(數據傳輸對象)和其他可能扁平化的dtos以獲取所需格式的數據(可能與實體結構不同,UI可能會驅動dto結構)。看看我的blog的信息有關DDD/CQRS/NHibernate的/存儲庫
剛剛閱讀[有效骨料設計](https://vaughnvernon.co/?p=139),推薦使用小骨料。一個巨大的聚合體可能會出現性能問題,這些聚合體包含一個具有數千個項目的子實體集合,因爲向該集合添加一個項目會獲取整個集合(例如,nhibernate可以這樣工作) – xhafan
修復了[Effective Aggregate Design] (http://dddcommunity.org/library/vernon_2011) – xhafan
這取決於很多因素。是否會對同一個表單進行同時修改?如果答案是肯定的,那麼你不應該創建一個更大的集羣集合。另外,從用戶界面角度來看,您的用例非常具有CRUD,我想您只需爲整個表單提供所有可編輯的字段並將其保存爲整個文檔。但是,如果您的用戶界面更加分離(例如,允許一次編輯單個組或單個部分等,那麼您將從多個AR中受益)。 – plalx