【发布时间】:2017-09-14 17:04:57
【问题描述】:
我正在使用 DDD 开发帮助台应用程序。我的问题是如何最好地处理可以引用两个可能的 AR 的实体。
我有一个RequestSubscriber 订阅请求更新的人。
此订阅者是Agent 或Contact。
问题是——我应该有一个对代理或联系人的可选引用并且只填写一个还是有一个具有关联类型的通用人员引用以确保链接到达正确的位置?
模型选项:
// 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; }
}
建造者:
// 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);
}
【问题讨论】:
-
另外一个想法是,也许我真的应该有两个不同的订阅者——代理订阅者和联系人订阅者。
-
我想念你提到的
Subscriber课程。RequestSubscriber是什么类型的IPerson为什么以及如何影响它?该 AR 保护的不变/一致性边界是什么? -
抱歉,
RequestSubscriber是订阅者类名。这主要是因为Contact的电子邮件通知与Agent不同。 -
在这种情况下,我将使用第二种方法(类型标志)。
标签: domain-driven-design aggregate