话说依赖注入

过往项目中,如果要实现动态创建对象实例,往往会通过XML(接口对应实现类映射)+工厂模式进行实现,如今有一种更加简便的实现方式,那就是通过Ninject

 

引用网上小段DEMO: 

 首先,是一个接口。还是从 HelloWorld 开始吧。

public interface IHelloWorld
{
    /// <summary>
    
/// 定义接口.
    
/// </summary>
    string HelloWorld();
}
 
然后是接口的两个实现.
public class HelloWorldEnglish : IHelloWorld
{
    string IHelloWorld.HelloWorld()
    {
        return "Hello World !";
    }
}
public class HelloWorldChinese : IHelloWorld
{
    string IHelloWorld.HelloWorld()
    {
        return "您好 世界 !";
    }
}

然后是一个使用接口的类。
using Ninject;
public class People
{
    #region  以构造函数方式. 实现依赖注入.
    private readonly IHelloWorld  peopleHelloWorld;
   [Inject]
    public People(IHelloWorld helloWorld)
    {
        if (helloWorld == null)
            throw new ArgumentNullException("helloWorld");
        this.peopleHelloWorld = helloWorld;
    }
    #endregion
    public void SayHello()
    {
        Console.WriteLine(this.peopleHelloWorld.HelloWorld());
    }
}

===== 上面是基本的 接口、实现、业务
 
===== 下面是 Ninject Modules 的配置.
using Ninject.Modules;
/// <summary>
/// 注册的接口和接口实现类.
///
///
/// NinjectModule
/// 是通过在 Load() 方法中。
///
/// 指定 接口的具体实现.
///
/// </summary>
public class MyModules1 : NinjectModule
{
    public override void Load()
    {
        // 指定 IHelloWorld  接口的实现 为 HelloWorldChinese
        
// ## To 方法:绑定到接口的具体实现。
        Bind<IHelloWorld>().To<HelloWorldChinese>();
    }
}
public class MyModules2 : NinjectModule
{
    public override void Load()
    {
        // 指定 IHelloWorld  接口的实现 为 HelloWorldEnglish
        
// ## To 方法:绑定到接口的具体实现。
        Bind<IHelloWorld>().To<HelloWorldEnglish>();
    }
}

===== 最后就是用于测试的 Main 了
using Ninject;
/// <summary>
/// Ninject 最基础演示例子.
/// </summary>
class Program
{
    static void Main(string[] args)
    {
        #region 不使用 Ninject 的方式.
        Console.WriteLine("不使用 Ninject 的方式.");
        // P1.
        People p1 = new People(new HelloWorldEnglish());
        p1.SayHello();
        // P2.
        People p2 = new People(new HelloWorldChinese());
        p2.SayHello();
        #endregion

        Console.WriteLine("####################");

        #region 使用 Ninject 的方式.
        Console.WriteLine("使用 Ninject 的方式.");
        using (IKernel  kernel = new StandardKernel(new MyModules1()))
        {
            People p = kernel.Get<People>();
            p.SayHello();
        }
        using (IKernel kernel = new StandardKernel(new MyModules2()))
        {
            People p = kernel.Get<People>();
            p.SayHello();
        }
        #endregion

        Console.ReadLine();
    }
}

运行输出的结果:
不使用 Ninject 的方式.
Hello World !
您好 世界 !
####################
使用 Ninject 的方式.
您好 世界 !
Hello World !

 

小结:


Ninject 通过 [Inject]、NinjectModule 与 Kernel 实现 依赖注入的处理。


需要被注入的 地方,加上 [Inject] 标记。


继承 NinjectModule 类的实现中。
通过 Bind,对于接口,具体定义使用哪一种实现。


最后

通过 Kernel.Get 来获取 Module 中定义的实现. 

posted @ 2012-10-24 23:01  itor  阅读(138)  评论(0编辑  收藏  举报