2015-09-24 90 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

添加到我的答案。 –