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
讨论:请加入知识星球或者微信圈子【首席架构师圈】
- 登录 发表评论
- 95 次浏览
发布日期
星期六, 五月 23, 2020 - 16:53
最后修改
星期四, 一月 5, 2023 - 21:56
Article
最新内容
- 21 hours ago
- 21 hours ago
- 21 hours ago
- 22 hours ago
- 1 day 22 hours ago
- 1 day 22 hours ago
- 1 day 22 hours ago
- 1 day 22 hours ago
- 1 day 22 hours ago
- 1 day 22 hours ago