手动依赖性注入

来源:互联网 发布:linux设置用户默认目录 编辑:程序博客网 时间:2024/05/01 11:37

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();       }   }

输出结果如下:



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

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

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

 

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

英文链接地址:

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


原创粉丝点击