读取模型/聚合代码以简化的DDD/CQS模式组织,其中需要从其他域读取模型



首先对于"简化的DDD/CQS模式"&;我引用https://github.com/dotnet-architecture/eShopOnContainers示例dotnet应用程序(这不是"严格"DDD/CQRS)。然而,我不是。net开发人员,我的问题与一般设计模式/代码组织有关。

我自己的情况如下:我有会议"域与"conference"根聚合和conference_edition;聚合。在RDBMS语言会议有许多版本。在这个领域里所有的"通讯"与外界是通过根聚合"会议"来完成的。所以有像Conference.create(), Conference.addDraftEdition(), Conference.publishEdition()等用例

我也有' booking';域它管理特定会议版本的预订(人们预订会议版本的门票)。

我的问题与"会议"的读取模型/聚合有关。服务(域)。此应用程序的CMS需要以下会议读取模型(为简单起见,以json为例):

{
"name": "My conference name",
"editions": [
{
// name, startDate, endDate can be directly read from "conference" domain aggregate
"name": "My conference 2021",
"startDate": "...",
"endDate": "...",
// following data come from "booking" domain
"completedBookingsCount": 20,
"pendingBookingsCount": 10,
"canceledBookingsCount": 2
},
...
]
}

我的问题是如何"制造"。这个读取模型(在简化的DDD示例eShopOnContainers中,我假设允许查询直接查询域聚合):

  1. 我可以通过处理来自"booking" booking"的BookingCreated、BookingCompleted和bookingcancelled集成事件,使额外的(附加到域聚合)读取聚合并更新它。在"会议"中保存每个会议版本的统计数据的服务服务读取模型然后和会议一起读取和";edition"骨料。在这种情况下,我应该如何组织我的代码关于额外的读聚合?我的意思是,它仍然是聚合的所以它应该"有"。它的自己的领域与命令,如"增加ecompletedeventsforconferencedidition";等等?或者我应该让它尽可能简单,没有所有的域限制,比如:
class BookingCanceledIntegrationEventHandler {
handle (BookingCanceledIntegrationEvent event) {
editionStatisticsRepository.increaseCanceledBookingsCount(event.editionId);
if (event.prevBookingStatus == 'pending') {
editionStatisticsRepository.decreasePendingBookingsCount(event.editionId);
} else if (event.prevBookingStatus == 'completed') {
editionStatisticsRepository.decreaseCompletedBookingsCount(event.editionId);
}
}
}
  1. 或者我应该处理一下read model "shaping"在API网关端?我想查询两个服务"会议"。和";booking"并在API网关端连接数据以组成所需的读取模型?

  2. 或者我应该将版本统计作为一种ValueObject添加到"edition"总吗?然而,AFAIK ValueObjects必须是不可变的,而且把这些数据(版本统计)放在"会议"上感觉是错误的。域…

如何按照DDD/CQS模式进行组织?

第一个或第二个都是合理的。它们之间的选择将在很大程度上受到您希望将业务逻辑扩展到基础设施中的程度的影响。

由于会议域和预订域似乎是不同的有界上下文,所以第三个选项实际上只有在会议版本发生某些更改时才是合理的,只有在预订处于特定状态时才允许。

最新更新