带有依赖注入的CQRS

本文关键字:CQRS 注入 依赖 | 更新日期: 2023-09-27 18:14:15

这应该是一个非常快的问题。我试图学习CQRS模式,有一件事是不清楚的。有两个调度程序:用于命令和查询。它们都需要注入DI内核以获得适当的处理程序。例如:

var handler = _resolver.Resolve<IQueryHandler<TQuery, TResult>>();

不违反DI的概念,Resolve不应该被使用,所有的东西都应该被注入构造函数/属性?

有一个更大的例子:http://www.adamtibi.net/06-2013/implementing-a-cqrs-based-architecture-with-mvc-and-document-db

请查看此方法:

public void Dispatch<TParameter>(TParameter command) where TParameter : ICommand
{
    var handler = _kernel.Get<ICommandHandler<TParameter>>();
    handler.Execute(command);
}

我在3个不同的页面上找到了这个解决方案。为什么要这样做,而不是创建一个工厂来映射Query到QueryHandler?

带有依赖注入的CQRS

如果您认为分派器是基础设施的一部分,那么在它内部调用Resolve()并不违反您所描述的DI概念。

处理程序通常被认为是逻辑管道(或线程,或者你想怎么想它们)的入口点。这类似于MVC中的控制器,或者控制台应用程序中的Main()方法。因此,像这些其他结构一样,分派器被认为是依赖链中的顶级对象,因此是引用容器的完全合法的位置。

编辑

所以评论提到了Composition Root (CR),这是一个我喜欢的术语,但在这个回答中故意避免使用,因为它容易让人感到困惑。CR是一个特定的类别吗?一个装配?我倾向于把它看作是一个概念,而不是一个具体的结构。它是应用程序中组成对象图的逻辑位置。

为了澄清我对控制器的意思:控制器将是入口点,并且(正如@Zbigniew所指出的)控制器工厂将是CR的(一部分).类似地,处理程序将是入口点,而调度程序将是CR.处理程序/控制器将没有对容器的引用,但dispatcher/ControllerFactory将。