2017-09-14 81 views
1

我正在使用DDD的幫助臺應用程序。我的問題是如何最好地處理可能引用兩個可能的AR的實體。DDD:如何處理多個可能的聚合根鏈接

我有一個RequestSubscriber這是訂閱請求更新的人。

該訂戶是AgentContact

問題是 - 我是否應該有一個對代理或聯繫人的可選引用,並且只填寫一個或具有關聯類型的通用人員引用以確保鏈接到達正確的位置?

型號選擇:

// This 
public class RequestSubscriber : DomainEntity, IPerson 
{ 
    // Constuctors... 

    public Guid? Agent_Id { get; private set; } 
    public Guid? Contact_Id { get; private set; } 
    public SubscriberType Type { get; private set; } 
    public Email Email { get; private set; } 
    public PersonName Name { get; private set; } 
} 

// Or This 
public class RequestSubscriber : DomainEntity, IPerson 
{ 
    // Constuctors... 

    public Guid Person_Id { get; private set; } 
    public SubscriberType Type { get; private set; } 
    public Email Email { get; private set; } 
    public PersonName Name { get; private set; } 
} 

Contructors:

// This 
    public RequestSubscriber(Guid id, Request request, IPerson person) : base(id) 
    { 
     Guard.ForNull(request, nameof(request)); 
     Guard.ForNull(person, nameof(person)); 

     if(person is Agent agent) 
     { 
      Email = agent.Email; 
      Name = agent.Name; 
      Type = SubscriberType.Agent; 
     } 
     else if (person is Contact contact) 
     { 
      Email = contact.Email; 
      Name = contact.Name; 
      Type = SubscriberType.Contact; 
     } 
     else 
     { 
      throw new ArgumentException("Subscribers must be an agent or contact", nameof(person)); 
     } 

     request.Subscribe(this); 
    } 

    // Or This 
    public RequestSubscriber(Guid id, Request request, Agent agent) : base(id) 
    { 
     Guard.ForNull(request, nameof(request)); 
     Guard.ForNull(agent, nameof(agent)); 

     Email = agent.Email; 
     Name = agent.Name; 
     Type = SubscriberType.Agent; 

     request.Subscribe(this); 
    } 

    public RequestSubscriber(Guid id, Request request, Contact contact) : base(id) 
    { 
     Guard.ForNull(request, nameof(request)); 
     Guard.ForNull(contact, nameof(contact)); 

     Email = contact.Email; 
     Name = contact.Name; 
     Type = SubscriberType.Contact; 

     request.Subscribe(this); 
    } 
+0

另外一個想法是,我應該真的有兩個不同的用戶 - 代理用戶和聯繫用戶。 –

+0

我想念你提到的'Subscriber'類。爲什麼以及它對RequestSubscriber的'IPerson'有什麼影響?那個AR保護的不變性/一致性邊界是什麼? –

+0

我的歉意,'RequestSubscriber'是訂戶類名稱。這主要是因爲'Contact'的電子郵件通知與'Agent'不同。 –

回答

0

的選擇可能是增加一個間接:)的另一個層面

RequestSubscriber似乎彙集RequestSubscriber 。您傳遞的是Request,但Subscriber部分中可能缺少一個概念。

同樣,Request摘要無論請求是什麼,你的Subscriber可以抽象任何您的用戶代表。

如果您還需要SubscriberType的另一個原因,那麼也許它可能會改變實現。

+0

我想到了這一點,國際海事組織將這個問題從'RequestSubscriber'代理給'Subscriber'。 –

+0

啊,我重新閱讀你的評論,你確實提到了這一點。這將取決於人們將要面臨的實際問題。 –