轻量级IOC框架Ninject使用

最近在做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)模型

View Code
 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)配置注入接口

View Code
 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) 构造函数注入

View Code
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)属性注入

View Code
public class LogService
     {   
          //属性注入
         public ILog _LogInstance { get; set; }

         public void WriteLog(string message)
         {
             if (_LogInstance == null)
             {
                 Console.WriteLine("_LogInstance 为空, 没有被注入.");
                 return;
             }

             _LogInstance.Write("_LogInstance已被注入:" + message);
         }
         
     }
View Code
//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下载

 MyIocSolution.rar

下一步准备整理微软的Unity2.0 Ioc、Castle 注入.

原文地址:https://www.cnblogs.com/johden2/p/2846260.html