跳转到主要内容
Chinese, Simplified

最近,我所属的团队决定对我们正在开发的应用程序采用域驱动设计,原因有很多。这个决定使我深入研究了领域驱动设计的最佳实践及其关键概念。

在这里,我将尝试在应用程序的域层范围内阐明命令和事件之间的区别。

命令和事件都是简单的域结构,只包含用于读取的数据。这意味着它们不包含行为或业务逻辑。

命令是发送到域以进行状态更改的对象,状态更改由命令处理程序处理。它们应该用祈使语气中的动词加上它所作用的聚合名来命名。由于命令保存的数据无效/不一致,可以拒绝此类请求。每个命令应有一个处理程序。一旦命令执行完毕,使用者就可以根据命令的输出执行任何任务。

事件是关于对域状态进行了哪些更改的事实陈述。它们是用发生变化的聚合名称加上动词过去分词命名的。事件发生在命令的后面。命令可以发出任意数量的事件。事件的发送者根本不关心是谁收到的,也不关心它是否已经收到。

这些术语只是概念,与技术无关。下面是C#中订单管理领域的一个例子,它主要受Gregory Young的m-r示例的启发。

// Event store is responsible for dispatching events, implementation details omitted
public interface IEventStore
{
    void DispatchEvent(long aggregateId, Event @event);
}public class PlaceOrderCommand
{
    public int OrderId { get; }
    public PlaceOrderCommand(int orderId)
    {
        OrderId = orderId;
    }
}public class OrderPlacedEvent
{
    public int OrderId { get; }
    public DateTime OrderDate { get; }
    public OrderPlacedEvent(int orderId, DateTime orderDate)
    {
        OrderId = orderId;
        OrderDate = orderDate;
    }
}public class OrderCommandHandler
{
    private readonly IEventStore _eventStore;
    public OrderCommandHandler(IEventStore eventStore)
    {
        _eventStore = eventStore;
    }    public void Handle(PlaceOrderCommand command)
    {
        // operations omitted
        _eventStore.DispatchEvent(command.OrderId, new OrderPlacedEvent(command.OrderId, DateTime.UtcNow));
    }
}

命令的意图和事件的意图完全不同。前者发出执行请求,而后者通知执行已完成。

原文:https://medium.com/ingeniouslysimple/command-vs-event-in-domain-driven-design-be6c45be52a9

本文:http://jiagoushi.pro/node/1024

讨论:请加入知识星球或者微信圈子【首席架构师圈】

 

Tags
 
Article
知识星球
 
微信公众号
 
视频号