讓我對唐的回答擴大,因爲我認爲他是領導,你在正確的軌道上。
M到N關係是自然的,有用的,可以在DDD中處理。如果您需要M對N關係,則無需嘗試將其轉換爲(或更可能是多個)M對1關係。 Udi Dahan's acticle給出了一個很好的例子,說明如何處理實體之間的M對N關係。
首先,確定哪個實體應該包含另一個實體的ID列表。 Udi使用職位發佈示例(Job
)和招聘發佈板(JobBoard
)。由於作業可以在沒有作業板的情況下存在,並且作業板不能在沒有作業的情況下存在,所以JobBoard
被選作聚合根並且將包含List<Job>
。這可能看起來像一個M對1的關係,但是,因爲每個Job
可以在多個JobBoard
的列表中,所以它實際上是M對N。
在你的SocialAccount
和Publisher
情況下,我建議這樣的事情在C#:
public class Publisher
{
public int ID {get; private set;}
private readonly IList<int> _AssignedSocialAccounts = new List<int>();
public IEnumerable<int> AssignedSocialAccounts { get { return this._AssignedSocialAccounts; } }
public Publisher(int ID) //Pass required fields to the constructor.
{
this.ID = ID;
}
public AssignSocialAccount(int SocialAccountID)
{
if(!this._AssignedSocialAccounts.Contains(SocialAccountID))
this._AssignedSocialAccounts.Add(SocialAccountID);
}
}
public class SocialAccount
{
public int ID {get; private set;}
public SocialAccount(int ID) //Pass required fields to the constructor.
{
this.ID = ID;
}
}
(本例中使用類似Jimmy Bogard's Wicked Domain Models域封裝。)
請注意,我選擇了Publisher
是因爲SocialAccount
可以自己存在,所以聚合根,但是Publisher
在沒有SocialAccount
的情況下沒有意義。
另請注意,我傳遞的是唯一標識,而不是對象本身的引用。在DDD中這是一種常見的方法,並且允許相關實體的延遲加載,雖然折衷是您必須調用存儲庫以在您想要訪問它們時獲取實體。
此方法還意味着您沒有將所有SocialAccount
作爲單個枚舉。它們被分成各種Publisher
之間。要獲得所有SocialAccount
的列表,將需要單獨的查詢。
是關於編碼實體本身還是關於如何將實體持久化到數據庫的問題?如果您只是在討論這些實體,那麼只需將SocialAccount從擁有一個發佈者集合改爲擁有對一個發佈者的引用即可。 – David 2010-12-06 12:02:59
我對兩者都很迷惑。發佈者不是社交帳戶的聚合根。我將如何堅持下去。 – chandra 2010-12-06 13:24:29
我需要知道DDD如何處理關係。無論是一對多還是多對多,在相同的總量和不同的總量中。互聯網上沒有這樣的信息。我GOOGLE了很多 – chandra 2010-12-06 13:26:41