【轉】輕量級IOC框架:Ninject


原文地址: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的介紹:

  1. What Is Ninject
  2. Why Use 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的介紹:

IOC : Unity 配置和使用


作者:Bruce編程的藝術世界
出處:http://coolcode.cnblogs.com
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM