最近在做Asp.Net MVC的项目时,抽空学习了一下Ninject Ioc注入, 之前用过微软的Unity Ioc注入,所以准备将这些Ioc注入整理起来.
1. Ninject是一个轻量级的基于.Net平台的依赖注入框架
Ninject下载:可以到这里打开Ninject的官网进行下载
最新源代码地址: http://github.com/ninject/ninject
用户向导:http://ninject.codeplex.com/wikipage?title=User%20Guide&referringTitle=Home
2. 模型与配置
(1)模型
public interface ILog { void Write(string message); } public class SystemLog : ILog { public void Write(string message) { Console.WriteLine("Target:SystemLog"); Console.WriteLine(String.Format("Message:{0}", message)); } }
(2)配置注入接口
public class NinjectConfig : Ninject.Modules.NinjectModule { //set relationship. public override void Load() { //1.绑定到接口的具体实现 Bind<ILog>().To<SystemLog>(); //Bind<ILog>().To<DatabaseLog>(); Bind<ISysLogService>().To<SysLogService>(); Bind<IDBLogService>().To<DBLogService>(); //2.自绑定 Bind<LogService>().ToSelf(); } }
(3)创建注入管理容器
private static IKernel kernelObj = new StandardKernel(new NinjectConfig());
3. 注入方式
(1) 直接获取接口注入
//1.依赖接口注入 ILog logObj = kernelObj.Get<ILog>(); Console.WriteLine("依赖接口注入-----------------"); logObj.Write("Hello Ninject!"); Console.WriteLine("");
(2) 构造函数注入
public class SysLogService : ISysLogService { //构造函数注入 private ILog _LogInstance; public SysLogService() { } /// <summary> /// 2.构造函数注入 /// </summary> /// <param name="tempInstance"></param> [Inject] //指定注入的构造函数 public SysLogService(ILog log) { _LogInstance = log; } public void WriteLog(string message) { if (_LogInstance == null) { Console.WriteLine("_LogInstance 为空, 没有被注入."); return; } _LogInstance.Write("_LogInstance已被注入:" + message); } }
(3)属性注入
public class LogService { //属性注入 public ILog _LogInstance { get; set; } public void WriteLog(string message) { if (_LogInstance == null) { Console.WriteLine("_LogInstance 为空, 没有被注入."); return; } _LogInstance.Write("_LogInstance已被注入:" + message); } }
//3.属性注入/ Console.WriteLine("属性注入-----------------"); LogService logServiceObj3 = new LogService() { _LogInstance = kernelObj.Get<ILog>() }; logServiceObj3.WriteLog("Hello Ninject!"); //OR LogService logServiceObj31 = kernelObj.Get<LogService>(); logServiceObj31._LogInstance = kernelObj.Get<ILog>(); logServiceObj31.WriteLog("Hello Ninject!"); Console.WriteLine("");
(4)Inject特性,在构造函数、属性和字段上加 [Inject]特性指示,以便指定注入的属性、方法和字段等
如果没有在构造函数上指定[Inject],默认选择需要注入的接口参数最多的一个,如果需要注入接口参数一样多,则为这些项中的第1个构造函数.
4. 参考网址
http://www.cnblogs.com/coolcode/archive/2009/11/10/Ninject.html
http://www.cnblogs.com/xray2005/archive/2011/10/31/2230900.html
http://www.cnblogs.com/xray2005/archive/2011/11/06/2237803.html
http://blog.csdn.net/simpkan/article/details/8169740
5. Demo下载
下一步准备整理微软的Unity2.0 Ioc、Castle 注入.