【问题标题】:CQRS Query Side implementationCQRS 查询端实现
【发布时间】:2016-08-29 19:05:35
【问题描述】:

我有点困惑在哪里实现应用程序的查询端,atm 我有下一个架构:

Product.UI.Web.Admin (MVC)
Product.Application
 -CommandHandlers (e.g OrdersCommandHandler)
 -Commands (e.g CreateOrder)
Product.Domain
 -Model (Behavior-rich models / repository interfaces)
Product.Infrastructure (Base interfaces / classes)
Product.Persistence
 -ReadModel (EF Generated models)
 --Implementation (Repository implementations: FindByID / Save)
  1. 我应该在 Product.Application 中放置 Queries 命名空间,并且它们应该直接从那里访问数据库吗? (UI
  2. 我应该创建新的程序集 Product.Queries 和 Product.UI.Web.Admin 应该直接访问它吗? (用户界面
  3. 我是否应该在 Product.Application 中添加 Queries 命名空间并创建新的 Assembly Product.Reporting 并让 Application 程序集通过 Queries 命名空间使用 Reporting 程序集? (UI

所有三个解决方案都将 DTO 返回到 UI。

我正在考虑解决方案 #3,因为它很容易在查询中使用 Domain Services 来构建结果,并且它还将使用 Product.Reporting 作为 Data Access可以使用 ADO.Net、Entity Framework 或 NHibernate 来实现。或者我误解了什么。

请指导我,帮我清理一下,谢谢。

更新 我来到了第四个变种。

  1. 创建了 Product.Infrastructure.Queries 程序集,我有数据库 (dbcotnext) 和 ReadModel(EF 生成模型和 通用查询接口)命名空间。
  2. 在 Product.Application 中添加了 DataModel 命名空间,我有 DTO 可以返回 UI
  3. 在 Product.Application 中添加了 Queries 命名空间,在那里我实现了通用查询并使用 dbcontext 检索数据、映射到 DTO 并返回到 UI。

【问题讨论】:

  • Product.Persistence.ReadModel 中有什么?是保存读取模型的数据库代码吗?
  • 在 Product.Application.Queries 中声明查询接口并在 Product.Infrastructure.Queries 中实现呢?
  • Product.Persistence.ReadModel 中的 @tomliversidge 是 EF 生成的数据库模型,在 Implementation Repository 接收域模型将其映射到 ReadModel 并 EF 保存它,忘了提到我在域模型中有存储库接口。
  • @plalx hm,还没有考虑过,我会尝试一下,atm 我正在寻找最佳实践以避免将来进行大规模重构;)但是如果我在基础设施中实现查询,则会出现一个问题,某些查询将不得不使用在应用程序服务层中实现的 DomainServices。我想我应该依赖注入它们吧?
  • 为什么查询需要域服务?

标签: domain-driven-design cqrs


【解决方案1】:

我想我只是在这里应用依赖倒置原则,并有类似Application.Queries 定义接口和Infrastructure.Queries 实现这些接口的东西。然而,我也看到了直接在Application 层中的基础设施问题。例如,这就是 Vaughn Vernon 在 SaasOvation 合作 BC 的 com.saasovation.collaboration.application.calendarCalendarEntryQueryService 中所做的。

【讨论】:

    【解决方案2】:

    我正在考虑解决方案#3,因为它可以很容易地在查询中使用域服务来构建结果,并且它将使用 Product.Reporting 作为数据访问,可以使用 ADO.Net、Entity Framework 或 NHibernate 来实现。或者我误解了什么。

    是的,我也认为你误解了一些东西。

    首先我们来谈谈什么是域服务?: 当你有一个涉及多个实体的域概念但你 不确定哪个实体“拥有”该行为。它似乎不属于他们中的任何一个。这种思维模式很强大 是否需要域服务的指标。 所以当你使用 cqrs 时,域服务位于命令端,因此查询端无法访问域服务,实际上自然不需要域服务,因为查询端不执行任何业务逻辑。你应该一直记住,Command 端和 Query 端是完全独立的。

    CQRS 的另一个重要特性是,ReadModel 可以使用 ADO.Net 或微 ORM 等低级数据访问技术,并通过士气低落的表进行查询以生成报告。所有这些想法都是出于性能考虑。随着系统的发展,还有更多将来您甚至可以在两个单独的实例上启动命令和查询端。

    【讨论】:

      猜你喜欢
      • 2010-12-03
      • 1970-01-01
      • 2013-04-02
      • 2012-02-27
      • 2020-09-20
      • 1970-01-01
      • 1970-01-01
      • 2014-10-21
      • 2011-01-02
      相关资源
      最近更新 更多