2015-09-24 54 views
3

这应该是一个非常快速的问题。我正在尝试学习CQRS模式,但有一点不清楚。有两个调度程序:用于命令和查询。他们都需要注入DI内核才能获得适当的处理程序。例如:具有依赖注入的CQRS

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

是不是违反DI的概念,解决不应该被用来,一切都应该与构造函数/属性注入?

有一个更大的例子: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的工厂?

+4

http://blog.ploeh.dk/2011/09/19/MessageDispatchingwithoutServiceLocation –

+0

顺便说一句,这是CQS而不是CQRS – MikeSW

回答

4

如果您认为调度程序是基础架构的一部分,调用其中的Resolve()并不违反您描述的DI概念。

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

编辑

所以意见提成分根(CR),这是一个学期,我喜欢,但故意试图避免这个答案,因为它往往会迷惑人。 CR是一个特定的类吗?一个组件?我倾向于把它看作一个概念而不是特定的结构。这是构成对象图的应用程序中的合理位置。为了阐明我对控制器的含义:控制器将成为切入点,并且(如@Zbigniew所指出的)控制器工厂将成为CR的一部分。同样,处理程序将成为入口点,调度程序将成为CR。处理程序/控制器不会有对容器的引用,但Dispatcher/ControllerFactory会。

+0

菲尔你是在暗示_handlers_是[Composition Root](http://blog.ploeh.dk/) 2011/07/28/CompositionRoot)? – Michael

+1

我不是一个Web开发人员,但我一直认为MVC中的任何依赖关系都是使用ASP.NET MVC工厂创建的,因此在它们内部使用容器而不是控制器本身。 @Michael提到了Composition Root,它应该只是一个应用程序内部的应用程序,如果你在处理程序中使用容器,它将所有使用的依赖关系隐藏在处理程序中,这不是错误吗? – MistyK

+0

添加到我的答案。 –