如何在CQRS中构造分隔符和名称空间?

问题描述 投票:1回答:2

我正在寻找有关如何在CQRS结构化的应用程序中构造名称空间的建议。

当前,命令端和查询端在每个有界上下文中都位于同一名称空间中,但是随着复杂性的增加,它开始产生问题。

当前结构具有以下文件夹,每个文件夹都包含实现:

Application
+ Api
+ Cli
+ Web
Domain
+ Action (Command and Command Handlers in one - we are not using a CommandBus) 
+ Event
+ Model
+-- Project
  |-- Project.file
  |-- ProjectRepository.file
Infrastructure
+ Consumer (Projections and ProcessManagers)
+ EventStore
+ Persistance (Denormalized read side)
+-- Project
  |-- SqlProjectRepository.file
Common (Supporting namespace)

现在的问题是,域模型当前同时包含实体和事件来源的聚合根,它们本质上分别仅是查询端和命令端的一部分。

查询侧和命令侧的聚合中没有重叠。

在分离中重构,应该在哪里分割?

建议1

一个完整的切片导致一个查询和一个命令侧,这意味着即使应用程序层也具有读写侧。

建议2

仅在域层上制成的切片,以便查询侧包含读取模型的(相当贫乏的)实体,并且命令侧保留事件,事件来源的聚合根等。

如果我的申请不适用,请提出第三个建议。谢谢。

namespaces domain-driven-design cqrs event-sourcing
2个回答
1
投票

当前结构具有以下文件夹,每个文件夹都包含实现...

很不幸。

如果您安排名称空间以使一起变化的事物靠近在一起,则您可能会更愿意承担维护负担。您的FrobMarbleRepository属于frobmarble命名空间,而不属于repository命名空间。

我认为我不同意Jimmy Bogard在这里的完整分析,但是关注功能的课程很重要

https://jimmybogard.com/vertical-slice-architecture/

If您碰巧需要在一个功能中为两个不同的想法使用相同的名称,然后您可能最终将该功能拆分为两个或多个命名空间;另一方面,需要重用名称可能表明您实际上正在处理多个功能。


0
投票

[这是我采用的方法-基于CQRS和DDD,请注意,我们的DDD扩展到具有单独的解决方案(.NET-用于不同域限制上下文的Web API)。

其次,我们所有的基础结构代码,身份验证处理和共享代码-在私有程序包管理器中完成,它消除了单个解决方案的一些混乱,我们在StarUp(DI)中对其进行DI。还请注意,我们使用EntityFramework作为我们的数据库实现。

但是,鉴于此,我和我的团队将CQRS和DDD分开。

+ App
+- Command
+-- Application.Command
+-- Data.Command.EntityFramework
+-- Domain.Command

+- Query
+-- Application.Query
+-- Data.Query.EntityFramework
+-- Domain.Query

+- Build
+-- Pipeline

+- Database
+-- Data.Database.EntityFramework
+-- Data.Database.Model

+- Test

Api (API app)
© www.soinside.com 2019 - 2024. All rights reserved.