Domain driven design 实体和服务
让我们看一个场景,在这个场景中,根据Order类中的一个属性,可以发送订单,也可以选择向客户发送邮件。发送电子邮件的功能位于“EmailService”服务中。 我的问题是Order.Dispatch方法应该调用EmailService来发送电子邮件,具体取决于Order类中的属性,还是应用程序层在调用Order.Dispatch方法后应该调用EmailService?在DDD中,哪种方法是正确的 多谢各位。Domain driven design 实体和服务,domain-driven-design,Domain Driven Design,让我们看一个场景,在这个场景中,根据Order类中的一个属性,可以发送订单,也可以选择向客户发送邮件。发送电子邮件的功能位于“EmailService”服务中。 我的问题是Order.Dispatch方法应该调用EmailService来发送电子邮件,具体取决于Order类中的属性,还是应用程序层在调用Order.Dispatch方法后应该调用EmailService?在DDD中,哪种方法是正确的 多谢各位。 NN我会将其保留在应用程序服务层。发送位在顺序中可能足够简单。发送,因为您可以传递服务
NN我会将其保留在应用程序服务层。发送位在
顺序中可能足够简单。发送,因为您可以传递服务实例,但首先编写电子邮件怎么样?这可能有点棘手
将其放置在某个应用程序服务层任务的操作脚本中是一种方法。您还可以响应域事件(例如,orderspatched
),然后发送。另一个选项(使用服务总线时)是发布OrderDispatchedEvent
,让您的Order endpoint订阅该事件,然后向电子邮件端点发送SendEMailCommand
但我不会尝试在域中处理发送,因为它更像是输出生成,而不是域通常涉及的某些业务操作/计算。这是一项业务需求,但在另一个层面上,报告的工作方式也是一样的。尽管与业务相关,或与流程相关,但它不一定属于该领域
只有我的ZAR 0.02:)所以没有正确的方法来做某事
如果Dispatch是指订单正在发送给客户(提示:此处可能需要更准确的语义),那么将订单状态设置为Dispatched的应用程序层也可以请求NotificationService通知客户
我相信域事件方法是最好的,因此一旦订单被发送,OrderDispatched事件将被发布,通知服务可以订阅它,并使用EmailService、SMSService等通知客户
但该命令本身与此无关。其他一些域对象决定何时分派订单,它向域服务发送DispatchOrder命令,域服务将执行分派,然后生成OrderDispatched事件。这意味着您的订单不应该具有分派方法,因为它不是执行分派的订单。一个简单的状态属性就足够了。域事件允许您解耦关注点。一旦发送订单,它可能会引发一个域事件,通知感兴趣的订阅者。这允许您决定将电子邮件发送到其他地方,以便订单聚合保持纯净。它通常也有助于更好地捕捉语言;发送订单时,发送电子邮件
public class Order
{
public Order(string id)
{
Guard.ForEmpty(id, "id");
Id = id;
}
public string Id { get; private set; }
public void Dispatch()
{
DomainEvents.Raise(new OrderDispatchedEvent());
}
}
public class MailService : IHandle<OrderDispatchedEvents>
{
private readonly IMailSender _mailSender:
public MailService(IMailSender mailSender)
{
_mailSender = mailSender;
}
public void Handle(OrderDispatchedEvent @event)
{
_mailSender.Send(...);
}
}
公共类秩序
{
公共秩序(字符串id)
{
警卫领班(身份证,“身份证”);
Id=Id;
}
公共字符串Id{get;private set;}
公共空间调度()
{
Raise(neworderDispatchedEvent());
}
}
公共类邮件服务:IHandle
{
专用只读iMail发件人\u邮件发件人:
公共邮件服务(IMailSender mailSender)
{
_mailSender=mailSender;
}
公共无效句柄(OrderDispatchedEvent@event)
{
_mailssender.Send(…);
}
}