对于使用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 );
基础设施服务
问题
这是组件与责任的准确摘要吗? 什么是缺失的,应该移动什么? 我可以用相关答案更新列表。
答案 0 :(得分:3)
就像你说的那样,有很多意见,你需要过滤它们,因为大多数时候人们在没有任何经验的情况下发表意见。 CQRS是一个很大的话题,所以我不认为没有经验,你应该完全跳入DDD和ES。服务应该包含得很好并且边界清晰,如果你遵循这些原则,你就可以在你的域中实现不同的实现,所以现在就开始使用CQRS,一旦你掌握了,就把DDD / ES添加到以下服务中CQRS。
我建议你这样开始构建你的架构的CQRS部分,一个命令的网关和一个用于查询的网关,因为这很常见,只是因为有很多决定要做:
Rest API
消息合同/验证
阅读模型 ...
并在没有DDD的情况下以更传统的方式开始实现您的服务,只使用存储库模式。当你开始感到自信时,也许你可以在聚合方面进入DDD,然后再转向ES。您可以随时更改初始服务。
我的建议是不要试图一次性完成,因为你会失败;我以前见过很多次。
例如:等待OrderShipped和OrderReceived events => fire CancelOrderCommand等待OrderCancelled =>消防订单已取消电子邮件
Sagas不应发布事件(saga模式),sagas聚合事件和提交命令。像NServiceBus这样的框架允许sagas发布事件这一事实并没有帮助,所以要注意。
单一(读取+写入)规范化数据库模型:Finder可以调用其他Finder(跨上下文)来满足嵌套对象
您希望在阅读模型中有哪些其他背景?
基础设施服务
Deals with infrastructure: db access, send emails, message queues, etc
不确定你的意思,但肯定看起来不对。消息队列或数据库服务??