这应该是一个非常快速的问题.我正在尝试学习CQRS模式,有一点不清楚.有两个调度程序:用于命令和查询.他们都需要注入DI内核才能获得合适的处理程序.例如:
var handler = _resolver.Resolve<IQueryHandler<TQuery, TResult>>();
Run Code Online (Sandbox Code Playgroud)
是不是违反了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);
}
Run Code Online (Sandbox Code Playgroud)
我在3个不同的页面上找到了这个解决方案.为什么这样做而不是创建工厂来将Query映射到QueryHandler?
如果您认为调度程序是基础结构的一部分,则在其中调用Resolve()不会违反您描述的DI概念.
处理程序通常被认为是逻辑管道(或线程,或者您想要考虑它们)的入口点.这类似于MVC中的控制器,或控制台应用程序中的Main()方法.因此,与其他构造一样,调度程序被视为依赖关系链中的顶级对象,因此是引用容器的完全合法的位置.
编辑
因此,评论中提到了组合根(CR),这是我喜欢的一个术语,但故意在这个答案中试图避免,因为它往往会让人感到困惑.CR是特定类吗?集会?我倾向于将其视为概念而非特定结构.它是构成对象图的应用程序中的逻辑位置.
为了澄清我对控制器的意义:控制器将是入口点,并且(如@Zbigniew所指出的)控制器工厂将是CR的一部分.同样,处理程序将是入口点,调度程序将是CR.处理程序/控制器不会引用容器,但Dispatcher/ControllerFactory会引用容器.