在一个普通的DDD项目中,我希望从存储库中检索到的实体作为DTO从域层发送到应用层。
似乎CQRS存在的一个原因是应用层所需的查询(主要是读操作)与域层所需的查询不同。因此,即使相同对象的查询结果在层之间也可能不同。
在我的域层中,我已经将查询结果映射到域实体。我很困惑一些CQRS示例将查询结果直接映射到跳过其匹配实体的DTO。
假设数据库返回:
{"person": {
"id:": 5323423,
"name": "John",
"family_name": "Smith"
...
}}
然而,实体布局将姓氏映射为姓氏:
class Person
{
Identity id;
String name;
String surname;
}
如果在我看到的一些CQRS示例中发生这种情况,提取的DTO看起来会有所不同,在将实体与其DTO匹配时会导致冲突。这些冲突是如何解决的?在我看来,任何DTO(与实体相关)都应该始终从其实体生成。但是,在这种情况下,在应用层中执行不同类型查询的自由会丢失。
答案 0 :(得分:4)
关键是你不要将实体映射到DTO。 DTO由特定上下文所需的内容定义,并成为查询/读取模型。更新实体时,事件处理程序也会使用它来更新读取模型。
所以基本上读取模型是从所有需要的实体(1个或更多)生成和更新的,通常是以增量方式。
答案 1 :(得分:4)
与@MikeSW完全一致,只需添加一个图表(借用axon-framework)来解释架构。
readmodel由查询用例驱动,您可以将其视为命令操作的输出。