Ale*_*one 8 design-patterns domain-driven-design cqrs
关于带有DDD的CQRS以及构成每个组件的内容,有很多意见.我还没有开始研究事件采购,所以下面的列表中没有包含与此相关的任何内容.虽然对ES的深入了解会很有趣.
到目前为止,我有以下相关责任的组件(见下文).我在下面的几点中概述了一些问题.
REST端点/应用程序
AggregateId orderId = AggregateId.get(); AggregateId userId = finder.findUserAggregateIdByEmail(email); dispatcher.fire(new CreateOrderCommand(orderId,userId,orderItems));
命令
new CreateOrderCommand( orderId, userId, orderItems );命令处理程序
聚合工厂
factory.createOrder( orderId, userId, orderItems );聚合根/聚合
order.cancel(); 域名服务
知识库
repo.load(orderId);事件
new OrderCancelledEvent( orderId );事件处理程序
冒险故事
发现者
finder.findOrdersOnDate( date );基建服务
题
这是组件与责任的准确摘要吗?缺少什么,应该移动什么?我可以用相关答案更新列表.
就像你说的,有很多意见,你需要过滤它们,因为大多数时候人们在没有任何经验的情况下发表意见。CQRS 是一个大主题,因此我认为如果没有相关经验,您不应该完全跳入 DDD 和 ES。服务应该被很好地包含并具有明确定义的边界,如果您遵循这些原则,您将能够在您的域中拥有不同的实现,因此现在只从 CQRS 开始,一旦掌握了 CQRS,就将 DDD/ES 添加到以下服务中。
我建议您开始构建架构的 CQRS 部分,一个用于命令的网关和一个用于查询的网关,因为这很常见,而且需要做出很多决定:
休息API
消息合约/验证
读取模型...
并开始以更传统的方式实现您的服务,无需 DDD,只需使用存储库模式。当你开始感到自信时,也许你可以在聚合方面跳入 DDD,然后再跳入 ES。您随时可以在稍后阶段更改初始服务。
我的建议是不要尝试一次完成所有事情,因为你会失败;我以前已经见过很多次这样的事情了。
例如:等待 OrderShipped 和 OrderReceived 事件 => 触发 CancelOrderCommand 等待 OrderCancelled => 触发订单取消电子邮件
Sagas 不应该发布事件(saga 模式),saga 聚合事件并提交命令。事实上,像 NServiceBus 这样的框架允许 sagas 发布事件并没有帮助,所以要注意。
单一(读+写)规范化数据库模型:Finder 可以调用其他 Finder(跨上下文)来满足嵌套对象
您希望在阅读模型中拥有哪些其他上下文?
基础设施服务
Deals with infrastructure: db access, send emails, message queues, etc
Run Code Online (Sandbox Code Playgroud)
不知道你的意思是什么,但它看起来确实不对。消息队列还是数据库服务??