Domain driven design 实体和服务

Domain driven design 实体和服务,domain-driven-design,Domain Driven Design,让我们看一个场景,在这个场景中,根据Order类中的一个属性,可以发送订单,也可以选择向客户发送邮件。发送电子邮件的功能位于“EmailService”服务中。 我的问题是Order.Dispatch方法应该调用EmailService来发送电子邮件,具体取决于Order类中的属性,还是应用程序层在调用Order.Dispatch方法后应该调用EmailService?在DDD中,哪种方法是正确的 多谢各位。 NN我会将其保留在应用程序服务层。发送位在顺序中可能足够简单。发送,因为您可以传递服务

让我们看一个场景,在这个场景中,根据Order类中的一个属性,可以发送订单,也可以选择向客户发送邮件。发送电子邮件的功能位于“EmailService”服务中。 我的问题是Order.Dispatch方法应该调用EmailService来发送电子邮件,具体取决于Order类中的属性,还是应用程序层在调用Order.Dispatch方法后应该调用EmailService?在DDD中,哪种方法是正确的

多谢各位。
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(…);
}
}