2010-12-06 748 views
4

我有兩個實體Publisher和SocialAccount。 SocialAccount包含多個帳戶,如 Twitter,Facebook等ddd中的多對多關係

1發佈者可以附加到許多社交帳戶和1社交帳戶包含多個發佈者,這個社交帳戶也與另一個實體活動相關聯。我的意思是兩個都是獨立的實體

在創建發佈者實例時,它不需要訂閱社交帳戶,它可以在後期訂閱它。

我需要訂閱發佈者到1個或多個社交帳戶。我該怎麼做

我怎樣才能將m到m的關係轉換爲1到很多關係,發佈者和社交帳戶之間。我不確定,因爲我在很多地方閱讀過我們應該避免M與M之間關係的實體。

+0

是關於編碼實體本身還是關於如何將實體持久化到數據庫的問題?如果您只是在討論這些實體,那麼只需將SocialAccount從擁有一個發佈者集合改爲​​擁有對一個發佈者的引用即可。 – David 2010-12-06 12:02:59

+0

我對兩者都很迷惑。發佈者不是社交帳戶的聚合根。我將如何堅持下去。 – chandra 2010-12-06 13:24:29

+0

我需要知道DDD如何處理關係。無論是一對多還是多對多,在相同的總量和不同的總量中。互聯網上沒有這樣的信息。我GOOGLE了很多 – chandra 2010-12-06 13:26:41

回答

4

讓我對唐的回答擴大,因爲我認爲他是領導,你在正確的軌道上。

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。

在你的SocialAccountPublisher情況下,我建議這樣的事情在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的列表,將需要單獨的查詢。