使用CQRS模式构建有界上下文。我为每个人准备了一些查询和处理程序。而现在,在表示层(http REST控制器)中我必须使用它。问题是,我应该将每个处理程序注入此控制器(有4个查询和处理程序)或使用命令总线并将右处理程序配置为指定的查询吗?
答案 0 :(得分:2)
嗯,无论哪种方式似乎都有道理;这可能暗示你应该传递一个表达Controller需要满足的合同的接口,并将实现细节放到一个级别。
我的猜测是你最终不希望控制器直接连接到查询处理程序,因为这将限制你在许多用例中的选项(例如:拥塞控制和背压)。但是直到后来你才知道,所以要保持松散。
答案 1 :(得分:-1)
过去我们已经将某种Query Executor注入控制器并将查询传递给它。例如,
public SomeController(IQueryExecutor queryExecutor) { ...
然后
var results = queryExecutor.Query(new GetSomeThings(args..));
GetSomeThings
的处理程序由支持基础架构连接,因此您无需注入它们。这有意义吗?
关于CQRS / CQS的警告:
如果您发现编写最多只使用一次或两次的查询和处理程序,或者专用于使用它们的控制器的命令,那么CQRS / CQS可能是您实际上不需要支付的抽象./ / p>的额外复杂性成本
我的团队和我发现在许多项目中都是如此。 CQRS / CQS通常只是另一个不必要的抽象,如存储库调度到ORM库或“服务”,它有一个或两个行调度到存储库,其中... 希望你明白这一点。
我喜欢Rule Of Three - 在你有超过3次使用之前不要试图获得可重用性。即便如此,如果你不需要它,也不要深入到像CQRS / CQS那样沉重的处方。 DDD非常酷,但您可以选择哪种元素对您有意义。当你应用语用推理时,通常很多都没有意义。
只是我的2 c。