【问题标题】:CQRS - What layer do QueryHandlers belong to?CQRS - QueryHandlers 属于哪一层?
【发布时间】:2018-06-07 08:50:46
【问题描述】:

In CQRS, should my read side return DTOs or ViewModels? 问题的答案表明每个小部件应该有一个 ReadModel(或投影,我假设它们是相同的)。

但如果是这种情况,那是否不会将 QueryHandler 移动到表示层中,以便每个小部件(在我的情况下是 Angular 中的组件)都有一个 QueryHandler?

更具体地说:QueryHandler 是否应该具有getReadModelForProjectPageSidebarById(< projectId >) 之类的功能,或者它们应该具有getProjectById(< projectId >) 之类的功能?如果后者是真的,那是否意味着需要一个额外的层来将 ReadModel 映射到小部件/组件可以使用的 ViewModel?

【问题讨论】:

标签: design-patterns cqrs


【解决方案1】:

确保这个想法是明确的:每个“写入模型”可以有多个“读取模型”。

从逻辑上讲,发生的事情与“非 CQRS”的情况并没有什么不同;我们正在获取写入模型记录的信息,将其转换为有趣的表示,然后将其返回给客户端(在您的示例中,返回到小部件)。

但这并不一定要“现场”完成;我们可以通过返回表示的缓存副本来响应查询。

例如,如果您考虑网络上的资源 - HTTP 已经在其中构建了对缓存的深刻理解。当从缓存中响应 HTTP 请求时,它基本上是对查询的纯粹表示处理,不是吗?

因此,如果您通过从缓存中返回表示来处理查询,那么处理程序将非常浅。

您仍然需要在某处采用 write 模型的“真理之书”表示并将其转换为适合缓存的表示的代码。但该代码的执行不必与 查询 同步——您可以在新鲜度与延迟之间进行交易。

那么让我看看我是否理解正确,读取模型属于表示,但查询处理程序属于应用层?你说下面的有道理吗?

https://imgur.com/9ndFL3h

那是....一点也不差。

或者更重要的是,我的问题中的两个查询处理函数都不正确。正确的函数调用将类似于句柄()。所以它实际上是对读取模型的请求,而不是对特定资源/实体(例如 Project 或 User)的请求?

是的。

【讨论】:

  • 哦,我的,非常有趣的答案!那么让我看看我是否理解正确,读取模型属于表示,但查询处理程序属于应用层?您会说以下内容有意义吗? imgur.com/9ndFL3h
  • 或更重要的是,我的问题中的两个查询处理函数都不正确。正确的函数调用将类似于handle(< query of type QueryForReadModelABC >)。所以它实际上是对读取模型的请求,而不是对特定资源/实体的请求,例如 ProjectUser
  • 头脑=被吹了。我知道我在某处遗漏了一些东西,只是无法将手指放在它上面。谢谢!
猜你喜欢
  • 2017-10-07
  • 2011-04-05
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 2022-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多