2

存儲庫模式表明您只能拉取聚合根。但是,如果您不知道它是父級(root),您將如何僅使用唯一身份(Child.ID)檢索單個孩子?在集合根中搜索兒童

class Parent 
{ 
    public int ID { get; set; } 
    IEnumerable<Child> Children { get; private set; } 
} 

class Child 
{ 
    public int ID { get; private set; } 
    public virtual Parent Parent { get; private set; } // Navigational model 
} 

我的應用程序是無狀態的(網絡),爲簡單起見,請求只包含孩子的ID。

我想到了三種方法:

  1. 呼叫所有的家長則問他們禮貌誰擁有這個孩子。
  2. 在ParentRepository中有一個名爲get GetChildByID的特殊例程,它會使存儲庫的抽象化失敗。
  3. 修改請求以包含父項,但似乎不必要,因爲您已具有唯一標識。
+1

在「ChildRepository」類中創建'GetChildByID(..)'方法? –

+4

如果你沒有父母可以識別他們,那麼孩子應該是一個總分。 – Hippoom

+0

@Hippoom我對Aggregate Root的瞭解是有限的,你是說只要一個實體具有唯一的身份,那麼他們可以被視爲根?我更新了代碼示例。 – Yorro

回答

2

看起來你可能在這裏看到了不同的有界的上下文。您在您的問題中提到「存儲庫...只能拉取聚合根。」;這是對的。另一個答案還提到,如果您需要查詢子對象,則子對象也可能是聚合根。這也可能是在不同的有界環境中是正確的。一個實體很可能在一個上下文中成爲一個聚合根,而在另一個上下文中成爲一個實體。

Users的域名爲例,他們已經在他們的設備上安裝了移動/平板電腦Apps。在用戶的情況下,我們可能需要用戶的基本屬性,如姓名,年齡等,我們可能還需要用戶在其設備上安裝的應用程序列表。在這種情況下,User是聚合根,App是值對象。

bounded context UserApps 
{ 
    aggregate root User 
    { 
     Id : Guid 
     Name : string 
     Age : int 
     InstalledApps : App list 
    } 

    value object App 
    { 
     Id : Guid 
     Name : string 
     Publisher : string 
     Category : enum 
    } 
} 

在另一種情況下,我們可以把世界的App中心的視圖,並決定App是聚合根。舉例來說,我們想報告哪些用戶安裝了給定的應用程序。

bounded context AppUsers 
{ 
    aggregate root App 
    { 
     Id : Guid 
     Name : string 
     InstalledBy : User list 
    } 

    value object User 
    { 
     Id : Guid 
     Name : string 
     InstalledOn : Date 
    } 
} 

這兩個有界上下文都有自己的倉庫,它返回相應的聚合根。您對數據的觀點存在微妙而關鍵的差異。

我想如果你退後一步,想想爲什麼你想查詢一個子對象,你可能會發現你實際上在一個完全獨立的有界上下文中。

+0

對不起,謝謝你的回覆。我會接受這是我需要的最接近的答案。我現在明白,聚合根根據上下文而改變。 我還發現了一篇不錯的文章,進一步幫助我理解這個問題。 http://www.sapiensworks.com/blog/post/2012/04/18/DDD-Aggregates-And-Aggregates-Root-Explained.aspx – Yorro

0

如果您需要孩子顯示/報告/查看/報告,那麼一個簡單的查詢圖層就可以做到。

如果你以任何方式操縱孩子,那麼它有一個一致性邊界,這聽起來像一個聚合非常多。

儘量不要查詢您的域對象。另一個簡單的經驗法則是不要在另一個集合中包含集合引用,而是僅使用引用的集合的Id或者表示關係的值對象。

0

實體導航不是域模型的目的。
聚合根是實體和值的組合,用於公開業務操作。
作爲副作用,您仍然可以通過AR執行一些簡單的查詢或導航,但是對於複雜的查詢,創建和使用查詢模型會更有效。
我在說CQRS

希望這可以幫助你。