Domain driven design 如何将查询处理程序作为依赖项处理?

Domain driven design 如何将查询处理程序作为依赖项处理?,domain-driven-design,cqrs,Domain Driven Design,Cqrs,Iam使用CQRS模式构建有界上下文。我为每个问题准备了一些查询和处理程序。现在,在表示层(http REST控制器)中,我必须使用它。问题是,我应该将每个处理程序注入该控制器(有4个查询和处理程序)还是使用命令总线并为指定的查询配置正确的处理程序?过去,我们已经将某种查询执行器注入控制器并将查询传递到该控制器中。例如 public SomeController(IQueryExecutor queryExecutor) { ... 然后 var results = queryExecutor

Iam使用CQRS模式构建有界上下文。我为每个问题准备了一些查询和处理程序。现在,在表示层(http REST控制器)中,我必须使用它。问题是,我应该将每个处理程序注入该控制器(有4个查询和处理程序)还是使用命令总线并为指定的查询配置正确的处理程序?

过去,我们已经将某种查询执行器注入控制器并将查询传递到该控制器中。例如

public SomeController(IQueryExecutor queryExecutor) { ...
然后

var results = queryExecutor.Query(new GetSomeThings(args..));
GetSomeThings
的处理程序由支持的基础结构连接,因此您不需要注入这些处理程序。这有意义吗


关于CQS/CQS的警告:

如果您发现您编写的查询和处理程序最多只使用一次或两次,或者专用于使用它们的控制器的命令,那么也许CQRS/CQS是一种抽象,您实际上不需要为此付出额外的复杂性成本

我和我的团队在许多项目中都发现了这一点。通常,CQRS/CQS只是另一个不必要的抽象,比如发送到ORM库的存储库,或者发送一行或两行到存储库的“服务”,这…
希望你明白了

我喜欢-在你有3个以上的用法之前,不要试图获得可重用性。即使这样,如果你不需要的话,也不要深入到像CQRS/CQS这样沉重的、非常有规定性的东西中去。DDD很酷,但你可以选择哪些元素对你有意义。通常,当你运用实用推理时,其中的大部分都没有意义


就我的2C.

好吧,无论哪种方式似乎都有道理;这可能是一个提示,您应该传入一个表示控制器需要满足的契约的接口,并将实现细节推到一个级别


我的猜测是,您最终不会希望控制器直接连接到查询处理程序中,因为这将限制您在许多用例中的选项(例如:拥塞控制和背压)。但是你要走得更远才会知道,所以请不要拘束。

如果我误解了你的意图,很抱歉。通过命令总线处理查询并不是CQR背后的真正想法。因此,通常,您有一个用于提交命令的命令总线和用于处理查询(不改变系统状态)的单独读取模型(在执行命令后更新)。您的查询处理程序在做什么?CQS是一种设计原则,而不是抽象。CQS是将CQS应用于模型的结果,同样不是抽象。一个模型(任何模型)是一个抽象,代码是该抽象的实现。不要与接口或抽象类等实现细节混淆。@MikeSW它也是ORM上下文中的抽象。如果我有一个ORM接口,让我可以轻松地发出命令和查询,然后将它们封装在某种CQS实现中,那么这是另一种抽象。我就是这么说的。例如,如果您没有ORM,而您是从头开始构建adonet,那么抽象(作为设计主体实现的一部分)可能更少,但仍然存在。这只是一个不关心ORM的原则,因为设计原则不应该关心实现细节。我认为您误解了CQS/CQR是什么。@MikeSW您似乎对帮助OP不感兴趣。虽然我尊重定义和语义准确性,但实际上OP正在寻求实现帮助。所以我的答案是针对常见CQS实现的上下文。也许你应该以务实的方式分享你的一些广博知识和经验,并给出一个答案,而不是对“是非”的争论性玩笑。