前言

前段时间看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

最新文章

  1. 《你必须知道的.NET》读书笔记三:体验OO之美
  2. TortoiseSVN使用方法
  3. laravel 事件的使用案例
  4. MMDrawerController第三方库的使用(根据导航item+滚动条progressView实现的手势滑动切换视图的)
  5. ASP 下 能作为json输出后js能解密的 escape 函数
  6. 我们说的oc是动态运行时语言是什么意思?
  7. HIBERNATE 01
  8. leetcode_Search in Rotated Sorted Array II
  9. qmake 小结(Qt 5.4)
  10. 用Java写的简单五子棋游戏(原创五子连珠算法)
  11. 记一次 联想杨天A4600K 安装操作系统遇到的尴尬
  12. Win7 IE11无法打开的可能解决办法
  13. 初学Python3 - 写一个登录程序
  14. Ext选项卡tabpanel切换动态加载数据
  15. 重写COMBOXEDIT
  16. volatile和synchronized实现内存可见性的区别
  17. Web前端开发必备
  18. 浅谈一类无关序列有前缀和性质的统计问题的离线解法 BZOJ3626
  19. Tinyos学习笔记(三)
  20. 2.选择元素 - 自定义过滤器《jquery实战》

热门文章

  1. IE 下 input 不响应 change 事件的处理
  2. MoveSessionRestore.bat for firefox
  3. web.xml文件中配置mime下载文件类型(转)
  4. Selenium webdriver Java 操作chrome 浏览器
  5. 1364:Field 'sex' doesn't have a default value [ SQL语句 ]
  6. TP框架I方法详解
  7. mui 跨域请求
  8. 【Python】help与dir的用法
  9. Android ListView工作原理全然解析,带你从源代码的角度彻底理解
  10. cocos2d-x 3.0rc2版公布了