Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将CQR与不分离的服务和存储库一起使用是否真的会影响代码质量?_C#_Asp.net_Asp.net Core_Asp.net Web Api_Webapi - Fatal编程技术网

C# 将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对象执行命令和查询 它是合适

我想问一下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可能会使您受益,而有些则会使事情复杂化:

  • CQR非常适合基于事件的编程模型。常见的情况是,CQRS系统被拆分为单独的服务,通过事件协作进行通信。这使得这些服务可以轻松利用事件源
  • 拥有独立的模型会引发一个问题,即保持这些模型的一致性有多困难,这就增加了使用最终一致性的可能性
  • 对于许多域,在更新时需要很多逻辑,因此使用派生来简化查询端模型可能是有意义的
  • 如果写入模型为所有更新生成事件,则可以将读取模型构造为事件海报,允许它们成为内存图像,从而避免大量数据库交互
  • CQR适用于复杂领域,这种领域也受益于领域驱动设计

在决定是否转移到CQRS体系结构模型时,这些是您应该考虑的一些因素。

诚然,我不是一名经验丰富的软件开发人员,但近几个月来我对这个问题思考了很多,以下是我的观察和结论

您完全正确地认为,CQR比将某些MediatR使用的类前缀为“命令”,而将其他类前缀为“查询”更复杂

不幸的是,出于某种原因,我不明白,最近人们开始将MediatR等同于CQR,尽管Jimmy Bogard通常在讨论MediatR时会将其与CQR联系起来

垂直切片 一般的好处来自这样一个事实:您正在创建垂直切片,而不是使用传统的、分层的、服务密集的方法。这使用例彼此分离,减少了由于共享服务而导致各种操作之间存在问题的隐式依赖关系而产生的bug和复杂性

这是一种基本模式,您可以在简单的应用程序中实现,无需太多摩擦,并且可以在任何地方提供一致的好处

CQRS 另一方面,CQRS需要为查询和命令创建并行数据访问结构,还可以选择创建并行模型。这本身就增加了复杂性和开销,一般来说,它提供了更简单的系统

  • 没有性能优势,因为您不必独立扩展读写

  • 没有结构上的好处,因为您不需要(例如)两个独立的开发团队在读模型和写模型上独立工作

应用的唯一好处是更容易对操作进行推理,因为它们是单独封装的,也称为。但是你已经从单独使用垂直切片中得到了好处

(老实说,我相信MediatR应该被称为CommandR。它实现了命令模式,而不是中介模式。)

因此,您应该问自己,通过承诺增加复杂性和开销,您当前在特定用例中可以获得什么样的优势

要点:
  • CQR在软件体系结构中并不是一个基本的、普遍的关注点,例如,实体和(可以说)垂直切片

  • 如果优势不明显,那么大多数研究该代码库的经验丰富的开发人员都会将其CQRS方面视为对代码质量的干扰和膨胀

  • 当使用垂直切片和MediatR时,在实际需要CQR的时候很容易实现它们。这进一步减少了以表面上看的方式增加复杂性的理由

  • 因此,我个人建议:

  • 继续使用相同的存储库来处理命令和查询,不要再认为您在做“CQR”,但作为语义细节,请继续将那些
    IRequest
    类称为“command”和“query”

  • 当您遇到这样一种情况,即针对您所面临的负载,需要对给定实体的查询进行独立缩放时,您可能希望使用单独的db或Dapper(而不是EF Core)和/或不同的模型,然后为系统的该部分实现并行CQRS结构。并且,随着项目的发展,根据需要严格扩展CQRS结构


  • 当然,如果您只是想创建一个示例项目来探索CQR,那么就开始实施对您的学习体验有用的任何东西。

    看看我的体系结构-我有单独的读写模型吗?看看上面的项目符号。它们是否适用于您的体系结构?只要涉及DDD和微服务,您通常需要使用CQR或API组合模式。但CQR可以解决API组合无法解决的问题。我瘦了