• 手动依赖性注入 NInject(1) (转载)


    NInject介绍

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

     

    逐步解说

    1、手动依赖性注入

    首先让通过一个简单的例子理解下依赖注入的思想。比如说你正在一个游戏,勇士们为荣耀而战。首先我们需要合适的兵器武装我们的勇士。我们先创建Sword(剑)。

        class Sword
    {
    public void hit(string target)
    {
    Console.WriteLine("Chopped {0} clean in half", target);
    }
    }

    接着,我们创建类Samurai来描述我们的勇士。为了攻击他们的敌人,我们需要创建一个攻击方法Attack。当这个方法被调用,勇士就会用他的剑攻击他的对手。

        public class Samurai
    {
    private Sword _sword;
    public Samurai()
    {
    _sword = new Sword();
    }
    public void Attack(string target)
    {
    _sword.hit(target);
    }
    }

    现在我们就可以创建我们的勇士并且战斗了。

        class Program
    {
    public static void Main()
    {
    Samurai warrior = new Samurai();
    warrior.Attack("the evildoers");
    }

    }

    这时控制台会输出“Chopped the evildoers clean in half to the console”。这个工程刚刚好,但是如果我们想用其它的武器武装我们的勇士,该如何做呢?因为Sword 对象在Samurai的构造函数中被创建,所以我们不得不修改类的实现。

    当一个类依赖一个实体,被叫做紧耦合。在这个例子里,Samurai类相对于Sword类是紧耦合的。当类是紧耦合,在没有改变实现的情况下,被依赖项是不能别交换的。为了避免紧耦合,我们可以使用接口提供间接层。创建一个接口来描述一个勇士。

    interface Iweapon
    {
    void Hit(string target);
    }

     

    接下来我们的Sword 类继承Iweapon接口

    class Sword:Iweapon
    {
    public void hit(string target)
    {
    Console.WriteLine("Chopped {0} clean in half", target);
    }
    }

    修改我们的 Samurai 类

    public class Samurai
    {
    private Iweapon _weapon;
    public Samurai()
    {
    _weapon = new Sword();
    }
    public void Attack(string target)
    {
    _weapon.hit(target);
    }
    }

    现在勇士可以使用不同的兵器了。但是Sword还是在Samurai的构造函数中被创建了。为了让Sword勇士使用其它的兵器,我们还是要修改类的实现。Samurai 类相对于Sword类还是紧耦合的。

    幸运的,有个更简单的解决方案。那就是把Sword作为参数传递给Samurai的构造函数。

     class Samurai
    {
    private Iweapon _weapon;
    public Samurai(Iweapon weapon)
    {
    _weapon = weapon;
    }
    public void Attack(string target)
    {
    _weapon.hit(target);
    }
    }

    这时候我们可以凭借Samurai的构造函数进行注入。这是个依赖性注入的例子。让我们再创建个其它的兵器(weapon)镖,给我们的勇士(Samurai)使用。

    public class Shuriken : Iweapon
    {
    public void hit(string target)
    {
    Console.WriteLine("Pierced {0}'s armor", target);
    }
    }

    我们可以创建一个军队

    class Program
    {
    public static void Main()
    {
    Samurai warrior1 = new Samurai(new Shuriken());
    Samurai warrior2 = new Samurai(new Sword());
    warrior1.Attack("the evildoers");
    warrior2.Attack("the evildoers");
    Console.Read();
    }
    }

    输出结果如下:

    C47451201112231747081.jpg



    这就是手动依赖性注入。你每次创建一个Samurai,首先要创建一些实现了IWeapon接口的对象,传递给Samurai的构造函数。现在我们改变勇士使用的武器,就不用再修改Samurai类了。Samurai是被分离出来的,我们就创建新的武器而不关系Samurai的代码。

    手动依赖性注入对小的项目来说是有效的策略,但是随着你应用程序的大小和复杂性的增长,关联对象将变得越来越臃肿。当依赖有自己的依赖会发生什么呢?你可以终止花费大量的时间来创建和关联对象,用更多的时候写有意义的代码。

    这就是Ninject可以帮助你的地方。

     

    总结:英语学的不好,费劲啊!!!翻译不好的地方还请大家多多指教。

    英文链接地址:

    http://ninject.codeplex.com/wikipage?title=Dependency%20Injection%20By%20Hand&referringTitle=User%20Guide 

    转自:http://www.cofftech.com/thread-14621-1-1.html 
     

  • 相关阅读:
    计网 | 文件传输协议
    Java | JDK8 | Integer
    2.项目管理-应用工具
    1.需求管理
    1.短视频运营基础
    10.视频效果---变形稳定器
    9.时间重映射
    8.效果控件之移动&&缩放
    7.标记
    6.子剪辑与合并剪辑
  • 原文地址:https://www.cnblogs.com/zhiji6/p/2470245.html
Copyright © 2020-2023  润新知