2009-09-25 49 views
37

我有兩個相關的(對於這個問題)項目和其他一些項目的解決方案;我應該怎麼做Ninject 2+注射(以及如何安排我的模塊?)

  1. 具有其他幾個項目使用的功能的類庫。
  2. ASP.NET MVC應用程序。

我的問題基本上是我應該做的IoC和Ninject 2,考慮...

  • 類庫需要一些DI愛情,除其他事項外,其中需要web請求特定會話存儲庫類對象(認爲工作單位)。
  • MVC應用程序需要DI,因爲Ninject 2基本上繼承自NinjectHttpApplication。
  • 類庫的單元測試需要注意這個以注入一組不同的存儲庫。
  • Web應用程序的單元測試需要注入出於同樣的原因。

我在這裏畫了一個心理角落,因爲我只看到三個選項開始。 DI類庫中,DI在Web應用程序,或兩者兼而有之,但也有問題,每個:

  • 因爲MVC應用程序需要從NinjectHttpApplication繼承我不能做DI 類庫開始。
  • 我只能在MVC應用程序中執行DI操作 - 畢竟,其他庫使用的是類庫,而MVC應用程序無論如何也不應該太瞭解庫的內部知識。
  • 我想這是我能看到的唯一出路:兩個項目的獨立IoC。類庫和MVC應用程序每個都有自己的IoC設置,並且爲他們的東西做DI,而沒有真正關心對方。

有沒有人有一些「最佳實踐」或指導方針如何做到這一點?我無法想象我是第一個在這種情況下結束的人,並且很高興知道這種「正確」方法是什麼...

謝謝!

+1

相關:http://stackoverflow.com/questions/5267525/dal-bll-gui-composition-root-how-to-setup-di-bindings – 2012-08-25 07:05:15

+1

重複一些值得挖掘的意見完整性,如果你真的試圖得到一個完整的見解http://stackoverflow.com/questions/5733591/best-location-for-fluent-ioc-configuration-modules-currently-trying-ininject – 2012-08-25 07:14:09

回答

63

我不知道NInject,但除非它與Windsor,StructureMap等大不相同,否則答案會保持不變,因爲有一些常見的DI模式。考慮到這一點:

首先要意識到的是,DI不與特定的框架綁定,如NInject或Windsor。這是一套遵循的技術和設計模式。您可以使用所謂的Poor Man's DI手動進行DI,但顯然DI Container更好。

爲什麼這是相關的?這是相關的,因爲一旦你意識到這一點,推論就是絕大多數你的應用程序的代碼應該有沒有知識的DI容器什麼的。

那麼你在哪裏使用DI容器?它只能用於組合根,在您的情況下它將對應於Global.asax。你可以在this SO answer中多讀一點這個問題 - 雖然這個問題是關於溫莎的,但其原理仍然是一樣的。

那麼你的單元測試呢?他們應該完全不瞭解DI容器。有關更多詳情,請參閱this other SO answer

DI可以在您的庫中實現,大量使用構造函數注入。您不需要參考任何DI容器來做到這一點,但如果使用DI容器來解析來自Composition Root的所有依賴關係,它會使生活變得更容易。

+0

嗨馬克 - 感謝您的答案,我想我得到現在,至少大部分是。但是,如果MVC/Global.asax負責設置所有DI,是否還需要捅入類庫中?考慮到類庫可能需要存儲每個Web請求ISession或類似的東西,這將用於構建所有存儲庫類。 MVC應用程序是否應該知道這個問題?只是試圖圍繞「正確的事情」去做。 :) – 2009-09-25 10:03:04

+1

由於您使用MVC,所以最好的選擇是使用自定義的ControllerFactory創建具有所有依賴關係的控制器。您可以在MvcContrib源代碼中看到Windsor的一個示例:http://github.com/mvccontrib/MvcContrib/blob/be0eb3addedf1775db719117e7fa73e516f74c8d/src/MvcContrib.Castle/WindsorControllerFactory.cs如果某些依賴項是庫中的類型,這些應該由控制器導入。如果你需要將ISession實例傳遞給你的庫,你可以使用Controller的ctx來做到這一點 - 它已經由你的自定義工廠設置。 – 2009-09-25 10:42:50

+0

再次感謝,馬克。我必須嘗試一下 - 我猜,沒有什麼比實際做的更好。 Ninject是基於模塊的,因此我可以在我的類庫中創建一個單獨的模塊,並由MVC應用程序中的IoC安裝程序自動使用,我只需要嘗試一下。 Mucho gracias! – 2009-09-25 11:03:30