C# 将CQR与不分离的服务和存储库一起使用是否真的会影响代码质量?
我想问一下WEB Api体系结构。我的项目由几个DDD、CQRS(无ES)微服务组成。每个服务都有域、应用程序、基础结构和UI层。对于这个例子,我将使用BikeMicroservice。它在UI层中有一个BikeController,它向MediatR发送命令或查询对象。在应用层中,我定义了使用同一BikeService对象执行C/Q的处理程序(对于每个C或Q)。此外,BikeService还具有BikeRepository,它还使用EF Core DbContext对象执行命令和查询 它是合适的CQRS设备吗? 我关心的是服务和存储库对象是否真的应该同时执行查询和命令。我在项目中观察到的唯一优势是thiner控制器(只发送查询或命令) 如何升级微服务的体系结构? 我是否应该将DAL和服务分为使用EF Core的BikeCommandRepository和使用Dapper的BikeQueryRepository?Martin Fowler,其中CQR可能会使您受益,而有些则会使事情复杂化:C# 将CQR与不分离的服务和存储库一起使用是否真的会影响代码质量?,c#,asp.net,asp.net-core,asp.net-web-api,webapi,C#,Asp.net,Asp.net Core,Asp.net Web Api,Webapi,我想问一下WEB Api体系结构。我的项目由几个DDD、CQRS(无ES)微服务组成。每个服务都有域、应用程序、基础结构和UI层。对于这个例子,我将使用BikeMicroservice。它在UI层中有一个BikeController,它向MediatR发送命令或查询对象。在应用层中,我定义了使用同一BikeService对象执行C/Q的处理程序(对于每个C或Q)。此外,BikeService还具有BikeRepository,它还使用EF Core DbContext对象执行命令和查询 它是合适
- CQR非常适合基于事件的编程模型。常见的情况是,CQRS系统被拆分为单独的服务,通过事件协作进行通信。这使得这些服务可以轻松利用事件源
- 拥有独立的模型会引发一个问题,即保持这些模型的一致性有多困难,这就增加了使用最终一致性的可能性
- 对于许多域,在更新时需要很多逻辑,因此使用派生来简化查询端模型可能是有意义的
- 如果写入模型为所有更新生成事件,则可以将读取模型构造为事件海报,允许它们成为内存图像,从而避免大量数据库交互
- CQR适用于复杂领域,这种领域也受益于领域驱动设计
在决定是否转移到CQRS体系结构模型时,这些是您应该考虑的一些因素。诚然,我不是一名经验丰富的软件开发人员,但近几个月来我对这个问题思考了很多,以下是我的观察和结论 您完全正确地认为,CQR比将某些MediatR使用的类前缀为“命令”,而将其他类前缀为“查询”更复杂 不幸的是,出于某种原因,我不明白,最近人们开始将MediatR等同于CQR,尽管Jimmy Bogard通常在讨论MediatR时会将其与CQR联系起来 垂直切片 一般的好处来自这样一个事实:您正在创建垂直切片,而不是使用传统的、分层的、服务密集的方法。这使用例彼此分离,减少了由于共享服务而导致各种操作之间存在问题的隐式依赖关系而产生的bug和复杂性 这是一种基本模式,您可以在简单的应用程序中实现,无需太多摩擦,并且可以在任何地方提供一致的好处 CQRS 另一方面,CQRS需要为查询和命令创建并行数据访问结构,还可以选择创建并行模型。这本身就增加了复杂性和开销,一般来说,它提供了更简单的系统
- 没有性能优势,因为您不必独立扩展读写
- 没有结构上的好处,因为您不需要(例如)两个独立的开发团队在读模型和写模型上独立工作
IRequest
类称为“command”和“query”
当然,如果您只是想创建一个示例项目来探索CQR,那么就开始实施对您的学习体验有用的任何东西。看看我的体系结构-我有单独的读写模型吗?看看上面的项目符号。它们是否适用于您的体系结构?只要涉及DDD和微服务,您通常需要使用CQR或API组合模式。但CQR可以解决API组合无法解决的问题。我瘦了