2015-01-08 144 views
2

很新的Ninject。我有一個項目像這個....MVC Ninject與多個項目

表示層>服務層>數據訪問層

我已經Ninject安裝在表示層,所以我的控制器與做工精細服務層(因爲我的表示層具有到服務層的參考)。

下面是一個例子(代碼內NinjectWebCommon.cs我的表現層的):

'Works within my Presentation Layer 
kernel.Bind<Service.IOrders>().To<Serice.Orders>(); 

'Does NOT Work within my Presentation Layer since it does not know about my dataAccess layer 
kernel.Bind<DataAccess.IOrdersRepository>().To<DataAccess.OrdersRepository>(); 

那麼,怎樣才能設置我的Ninject以這樣的方式,所以我可以從一個地方注入只有而不必引用我的數據訪問層。

回答

1

使用依賴注入時,應該有一個知道所有綁定的組合根。 另請參閱Mark Seeman的博客條目Composition Root

這意味着它需要引用您的DAL。 如果您真的需要將您的表示層與DAL分開,那麼您需要將組合根提取到不包含表示層的單獨程序集(應用程序)中。應用程序集將定義所有綁定並組成對象圖。爲此,它需要引用所有其他程序集(表示層,DAL,..什麼不是)。

但是,ninject和AutoFac提供了稍微不同的設計選擇:模塊(有關ninject說明,請參見here)。在Modules @ DAL程序集中定義DAL綁定,在modules @ presentation assembly中定義表達式綁定,然後在反射中加載所有已部署程序集的所有模塊。例如:

-- presentation.dll 
    - PresentationModule : NinjectModule 
    --> defines presentation bindings 
-- dal.dll 
    - DataAccessModule : NinjectModule 
    --> defines data access bindings 
-- app.dll (asp.net mvc application) 
    - creates kernel 
    - then searches for all deployed *.dll's, 
    in those it searches for all implementations of `NinjectModule` 
    and then loads these. This is done by: 
    kernel.Load(AppDomain.CurrentDomain.GetAssemblies()) 
    - does not reference dal.dll or presentation.dll! 

請注意,我不知道是否AppDomain.CurrentDomain.GetAssemblies()作品的asp.net應用程序。也許你需要一些其他方法來查找所有部署的程序集。

另請注意,除非您需要分層(也參見here)或更改圖層而不重建整個應用程序,否則不必爲單獨的圖層分別安裝不同的程序集。

還有與解答了一些類似的問題:

,你可能也想看看this blog post