轻量级IOC框架:Ninject

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(); 
}

posted @ 2010-12-01 10:31  Ants  阅读(395)  评论(0编辑  收藏  举报