赞助商
前言

前段时间看Mvc最佳实践时,认识了一个轻量级的IOC框架:Ninject。

建议新手请先看看Ninject的介绍:

  1. What Is Ninject
  2. Why Use Ninject

我节选其中关于Ninject的好处,并翻译如下:

Ninject是一个快如闪电、超轻量级的基于.Net平台的依赖注入框架。它能够帮助你把应用程序分离成一个个松耦合、高内聚的模块,然后用一种灵活的方式组装起来。通过使用Ninject配套你的软件架构,那么代码将会变得更加容易编写、重用性强、易于测试和修改。

搜索博客园尚未找到关于Ninject的使用,因此本文发布一个示例作入门级教程。

Ninject入门级示例

像以前的IOC教程那样,拿日志记录做示例应该是非常直观的。

首先编写一个日志记录的接口:
  1. public interface ILogger
  2. {
  3.     void Write(string message);
  4. }
复制代码
以及FlatFileLogger, DatabaseLogger 来实现Logger的逻辑(只是为了演示Ninject的使用,所以具体逻辑是省略的,只是通过控制台告诉大家使用了那个Logger):
  1. public class FlatFileLogger : ILogger
  2. {
  3.     public void Write(string message)
  4.     {
  5.         Console.WriteLine(String.Format("Message:{0}", message));
  6.         Console.WriteLine("Target:FlatFile");
  7.     }
  8. }

  9. public class DatabaseLogger : ILogger
  10. {
  11.     public void Write(string message)
  12.     {
  13.         Console.WriteLine(String.Format("Message:{0}", message));
  14.         Console.WriteLine("Target:Database");
  15.     }
  16. }
复制代码
Ninject通过NinjectModule来配置依赖注入(不知道有没有文件配置,在官方教程里没找到相关资料),这里自定义自己的Module:
  1. internal class MyModule : Ninject.Modules.NinjectModule
  2. {
  3.     public override void Load()
  4.     {
  5.         Bind<ILogger>().To<FlatFileLogger>();
  6.         Bind<ILogger>().To<DatabaseLogger>();
  7.     }
  8. }
复制代码
具体调用方法:
  1. private static IKernel kernel = new StandardKernel(new MyModule());
  2. static void Main(string[] args)
  3. {
  4.     ILogger logger = kernel.Get<ILogger>();
  5.     logger.Write("Bruce Say: Hello Ninject!");
  6.     Console.WriteLine("continues..");
  7.     Console.Read();
  8. }
复制代码
通过 kernel.Get<ILogger>() 来获取ILogger的实例,之前在MyModule里先后对ILogger 绑定了FlatFileLogger 和 DatabaseLogger,而kernel.Get<ILogger>() 这里返回第一个绑定的对象,即FlatFileLogger。

构造函数注入

这里新建一个ITester 和 IocTester, 而IocTester 依赖于ILogger:
  1. interface ITester
  2. {
  3.     void Test();
  4. }

  5. class IocTester:ITester
  6. {
  7.     private ILogger _logger;
  8.     public IocTester(ILogger logger)
  9.     {
  10.         _logger = logger;
  11.     }

  12.     public void Test()
  13.     {
  14.         _logger.Write("Bruce Say: Hello Ninject!");
  15.     }
  16. }
复制代码
下面看看Ninject是怎么配置的,很简单修改MyModule,绑定ITester:Bind<ITester>().To<IocTester>():
  1. internal class MyModule : Ninject.Modules.NinjectModule
  2. {
  3.     public override void Load()
  4.     {
  5.         Bind<ILogger>().To<FlatFileLogger>();
  6.         Bind<ITester>().To<IocTester>();
  7.     }
  8. }
复制代码
从以上配置中,我们是看不到IocTester 和ILogger 是有依赖关系的,这就是依赖注入的好处。只是简单告诉哪个接口对应哪个类,剩下的任务就可以交给Ninject来处理了。
  1. private static IKernel kernel = new StandardKernel(new MyModule());
  2. static void Main(string[] args)
  3. {
  4.     ITester tester = kernel.Get<ITester>();
  5.     tester.Test();
  6.     Console.WriteLine("continues..");
  7.     Console.Read();
  8. }
复制代码
另外Ninject 也支持属性、方法等注入,具体可以参考用户向导。

IOC的世界有句话是这样说的:Don't call me, I will call you. (文/ CoolCode

相关资源

介绍Ninject 在ASP.NET MVC 的应用(英文):How to use Ninject 2 with ASP.NET MVC

另一篇关于微软的IOC框架Unity的介绍:IOC : Unity 配置和使用

源码下载:
赞助商
赞助商
TOP