Ninject是一個IOC容器,用來解決程序中組件的耦合問題,它的目的在於做到最少配置。簡單來講就是 為我們選擇一個想要的類來處理事務。
百度百科的解釋:一個快如閃電、超輕量級的基於.Net平台的依賴注入框架。把應用程序分離成一個個松耦合、高內聚的模塊,然后用一種靈活的方式組裝起來。
一、Console項目使用
參考:[ASP.NET MVC 小牛之路]04 - 依賴注入(DI)和Ninject
NuGet引入:Ninject

/// <summary> /// 1、簡單的情況,實現類 沒有依賴其他類 /// </summary> public static void Simple() { //一般的使用情況 Business bus = new Business(new LinqValueCalculator()); decimal result = bus.CalculatStockValue(); Console.WriteLine(result); //使用Ninject。。LinqValueCalculator綁定接口 //1、創建一個Ninject內核對象 IKernel ninjectKernel = new StandardKernel(); //2、將想使用的類型和他的接口進行綁定,告訴Ninject,當接收到一個實現IValueCalculater的請求的時候, //創建並返回LinqValueCalculator這個類,上面的兩個關鍵字Bind,To可以幫助我們理解他的意思。 ninjectKernel.Bind<IValueCalculater>().To<LinqValueCalculator>(); //3、用Ninject的Get方法去獲取IValueCalculator接口的實現 //Ninject將自動為我們創建LinqValueCalculator類的實例,並返回該實例的引用。 IValueCalculater calcImpl = ninjectKernel.Get<IValueCalculater>(); //4、創建Business實例並注入依賴(calcImpl) Business business = new Business(calcImpl); Console.WriteLine(business.CalculatStockValue()); }
代碼:https://github.com/peterYong/SelfTest/tree/master/Ninject.Test
對於單個簡單的DI,用Ninject確實顯得麻煩。但如果添加多個復雜點的依賴關系,使用Ninject則可大大提高編碼的工作效率。
當我們請求Ninject創建某個類型的實例時,它會檢查這個類型和其它類型之間的耦合關系。如果存在依賴關系,那么Ninject會根據依賴處理理它們,並創建所有所需類的實例。
拓展:
using (var kernel = new StandardKernel(new BookingServiceNinjectModule(),new CacheNinjectModule())) { Client = kernel.Get<IHoldTaskCksService>(); Redis = kernel.Get<ICacheManager>(CacheTypeName.Redis); }
二、MVC中使用Ninject
代碼:https://github.com/peterYong/SelfTest/tree/master/Ninject.MVC
參考:[ASP.NET MVC 小牛之路]05 - 使用 Ninject
1、創建Controller Factory
在ASP.NET MVC中,一個客戶端請求是在特定Controller的Action中進行處理的。
默認情況下,ASP.NET MVC使用內置的Controller工廠類 DefaultControllerFactory來創建某個請求對應的Controller實例。
有時候默認的Controller工廠不能滿足我們實際的需求,我們就需要對這種默認行為進行擴展,即創建一個繼承自DefaultControllerFactory類的自定義Controller工廠類(NinjectControllerFactory)並重寫其中的一些方法。
2、設置工廠
Controller工廠類創建好后,我們就需要告訴MVC用我們的NinjectControllerFactory類來創建Controller對象,為此,需在Global.asax文件的Application_Start方法中注冊
3、添加領域模型
准備數據
4、添加接口,Repository
需要一種方式來從數據庫中讀取Book數據。
在這我們不防為數據的使用者(這里指Controller)提供一個IBookRepository接口,在這個接口中聲明一個IQueryable<Book>類型的屬性Books。
這樣,通過該接口使用依賴注入,使用者就可以拿到Books數據集合,而不用關心數據是如何得到的。
為此,我們在BookShop.Domain工程中添加一個名為 Abstract的文件夾,在該文件夾中添加我們的IBookRepository接口文件,
5、添加接口實現
添加一個名為Implement文件夾用於存放具體的類。添加一個實現了IBookRepository接口的BookRepository類來作為我們的Book數據倉儲。
6、添加綁定
private void AddBindings() { ninjectKernel.Bind<IBookRepository>().To<BookRepository>(); }
7、添加控制器
顯示列表
8、添加視圖
顯示數據
更多參考:輕量級IOC框架:Ninject