原文地址:http://www.cnblogs.com/coolcode/archive/2009/11/10/Ninject.html
前言
前段時間看Mvc最佳實踐時,認識了一個輕量級的IOC框架:Ninject。通過google搜索發現它是一個開源項目,最新源代碼地址是:http://github.com/enkari/ninject/tree/master
用戶向導:http://ninject.codeplex.com/wikipage?title=User%20Guide&referringTitle=Home
建議新手請先看看Ninject的介紹:
我節選其中關於Ninject的好處,並翻譯如下:
Ninject是一個快如閃電、超輕量級的基於.Net平台的依賴注入框架。它能夠幫助你把應用程序分離成一個個松耦合、高內聚的模塊,然后用一種靈活的方式組裝起來。通過使用Ninject配套你的軟件架構,那么代碼將會變得更加容易編寫、重用性強、易於測試和修改。
搜索博客園尚未找到關於Ninject的使用,因此本文發布一個示例作入門級教程。
Ninject入門級示例
像以前的IOC教程那樣,拿日志記錄做示例應該是非常直觀的。
首先編寫一個日志記錄的接口:
public interface ILogger { void Write(string message); }
以及FlatFileLogger, DatabaseLogger 來實現Logger的邏輯(只是為了演示Ninject的使用,所以具體邏輯是省略的,只是通過控制台告訴大家使用了那個Logger):
public class FlatFileLogger : ILogger { public void Write(string message) { Console.WriteLine(String.Format("Message:{0}", message)); Console.WriteLine("Target:FlatFile"); } } public class DatabaseLogger : ILogger { public void Write(string message) { Console.WriteLine(String.Format("Message:{0}", message)); Console.WriteLine("Target:Database"); } }
Ninject通過NinjectModule來配置依賴注入(不知道有沒有文件配置,在官方教程里沒找到相關資料),這里自定義自己的Module:
internal class MyModule : Ninject.Modules.NinjectModule { public override void Load() { Bind<ILogger>().To<FlatFileLogger>(); Bind<ILogger>().To<DatabaseLogger>(); } }
具體調用方法:
private static IKernel kernel = new StandardKernel(new MyModule()); static void Main(string[] args) { ILogger logger = kernel.Get<ILogger>(); logger.Write("Bruce Say: Hello Ninject!"); Console.WriteLine("continues.."); Console.Read(); }
通過 kernel.Get<ILogger>() 來獲取ILogger的實例,之前在MyModule里先后對ILogger 綁定了FlatFileLogger 和 DatabaseLogger,而kernel.Get<ILogger>() 這里返回第一個綁定的對象,即FlatFileLogger。
構造函數注入
這里新建一個ITester 和 IocTester, 而IocTester 依賴於ILogger:
interface ITester { void Test(); } class IocTester:ITester { private ILogger _logger; public IocTester(ILogger logger) { _logger = logger; } public void Test() { _logger.Write("Bruce Say: Hello Ninject!"); } }
下面看看Ninject是怎么配置的,很簡單修改MyModule,綁定ITester:Bind<ITester>().To<IocTester>():
internal class MyModule : Ninject.Modules.NinjectModule { public override void Load() { Bind<ILogger>().To<FlatFileLogger>(); Bind<ITester>().To<IocTester>(); } }
從以上配置中,我們是看不到IocTester 和ILogger 是有依賴關系的,這就是依賴注入的好處。只是簡單告訴哪個接口對應哪個類,剩下的任務就可以交給Ninject來處理了。
private static IKernel kernel = new StandardKernel(new MyModule()); static void Main(string[] args) { ITester tester = kernel.Get<ITester>(); tester.Test(); Console.WriteLine("continues.."); Console.Read(); }
另外Ninject 也支持屬性、方法等注入,具體可以參考用戶向導。
IOC的世界有句話是這樣說的:Don't call me, I will call you.
相關資源
介紹Ninject 在ASP.NET MVC 的應用(英文)
How to use Ninject 2 with ASP.NET MVC
另一篇關於微軟的IOC框架Unity的介紹:
作者:Bruce(編程的藝術世界)
出處:http://coolcode.cnblogs.com
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。