2010-01-19 56 views
3

我有一箇中型asp.net MVC應用程序。它消耗了一個處理所有存儲庫使用的服務層,調用域服務等。我的控制器操作非常渺茫 - 它們基本上調用一個服務類,得到響應並顯示respose。大多數組件都是基於一些窮人DI的界面。該應用程序正在不斷增長,需要更好的測試支持,並開始爲IoC容器提供支持。什麼是使用服務層時配置IoC容器的正確層?

我讀的所有內容(例如this SO question)聲明我應該在應用程序根目錄下配置IoC。這對我來說是有意義的,如果我正在使用我的控制器操作中的存儲庫並且需要控制器級別的DI,但我不是。看起來好像我想在我的服務層中創作我的作品。我一直在想,我不希望我的web.config(或其他配置)在用戶界面層甚至提及/看到/聽到關於存儲庫,信用卡處理器等。

我在想這個方法是否正確或者我只需要克服它?

回答

1

你只需要克服它:)

有您組成的根在應用程序根並不需要你有在web.config中很多DI容器的東西。你可以,如果你願意,但它是可選的。什麼是不可選將組合根設置在應用程序根目錄中時,您需要在Global.asax中包含一些DI代碼。

您可能會發現它無關緊要,因爲您的控制器非常薄,但這不是真正的要點。實際的觀點是你(抽象的'你')想要推遲耦合類,直到最後一個負責時刻。夫妻類型越早,靈活性就越低。

如果您將服務層中的類耦合在一起,那麼您在此時做出不可逆轉的決定。如果事後證明你需要以不同的方式編寫這些服務,那麼你不能 - 也就是說,不能不重新編譯。

如果有這樣做的主要好處,我可以理解你爲什麼想要,但沒有。您可以等待組成所有組件,直到您絕對必須這樣做 - 而這正是應用程序的入口點。

0

從Java的角度來看,我爲我的IoC容器使用了Spring框架。有了它,容器真的是應用程序範圍內的。儘管您可以爲不同的層(持久性配置文件,服務配置文件,控制器配置文件等)提供不同的配置文件,但所有對象(Java語言中的bean)都會進入容器。

我認爲這仍然可以,因爲你沒有提到類之間的耦合。視圖不需要知道信用卡處理器,只是因爲它們在同一個IoC容器中。這些類將只接收(通過注入)他們需要的依賴關係,而不關心容器中的其他對象。

1

我和你有相同的情況,我按照如下方式處理它。

我使用的一般規則是有一個global.asax或類似的東西,它需要執行註冊IoC組件的代碼。另一種說法是,您需要針對運行的每個不同流程運行一個流程(即網站處於一個流程中,服務處於另一個流程中)。

在我的情況下,我這樣做一次爲mvc網站global.asax和再次爲服務器。在這種情況下,服務和網站之間所做的註冊會有所不同。

另外我還做了一件事。由於我在mvc應用程序和服務之間重用了組件(即日誌記錄),因此我有第三個核心組件註冊系統的核心IoC組件,並且此組件由網站和服務註冊調用。因此,我將服務和網站之間的所有內容都納入核心註冊,然後任何不同的內容進入「界面」特定註冊。

希望有所幫助。