私は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);
}
もう1つの考え方は、実際には2つの異なるサブスクライバ(エージェントサブスクライバとコンタクトサブスクライバ)を用意する必要があります。 –
あなたが言及した 'Subscriber'クラスが欠けています。なぜ、 'RequestSubscriber'に' IPerson 'とはどんな種類のものが重要なのでしょうか?そのARによって保護される不変/一貫性の境界は何ですか? –
申し訳ありませんが、 'RequestSubscriber'はサブスクライバクラス名です。これは主に、「連絡先」の電子メール通知が「エージェント」と異なるため重要です。 –