2017-09-14 15 views
1

私はDDDを使ってヘルプデスクアプリケーションを開発しています。私の質問は、2つの可能なARを参照できるエンティティをどのように処理するのが最善かです。DDD:複数の可能な集合ルートリンクを扱う方法

私にはRequestSubscriberがあります。これは、アップデートの更新を購読している人です。

このサブスクライバはAgentまたはContactです。

質問は、エージェントまたは連絡先へのオプションの参照があり、リンクが適切な場所に確実に届くように、関連するタイプの一般的な人の参照が1つだけあるか、

モデルオプション:

// 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

もう1つの考え方は、実際には2つの異なるサブスクライバ(エージェントサブスクライバとコンタクトサブスクライバ)を用意する必要があります。 –

+0

あなたが言及した 'Subscriber'クラスが欠けています。なぜ、 'RequestSubscriber'に' IPerson 'とはどんな種類のものが重要なのでしょうか?そのARによって保護される不変/一貫性の境界は何ですか? –

+0

申し訳ありませんが、 'RequestSubscriber'はサブスクライバクラス名です。これは主に、「連絡先」の電子メール通知が「エージェント」と異なるため重要です。 –

答えて

0

オプションは、間接の別のレベルを追加することも:)

あなたRequestSubscriberRequestを一緒に持っているようだとSubscriber 。あなたはRequestを渡していますが、Subscriberの部分に欠けている概念があるかもしれません。

Requestは、あなたのサブスクライバが表すものを抽象化できるという要求が何であれ、要約しています。

SubscriberTypeが必要な理由がある場合は、おそらく実装が変更される可能性があります。

+0

私はその問題とIMOについて、問題を 'RequestSubscriber'から' Subscriber'に代理することを考えました。 –

+0

ああ、私はあなたのコメントを読んで、あなたはこれを言及した。それは実際の問題が動いていることに依存するつもりです。 –

関連する問題