Chinaunix首页 | 论坛 | 博客
  • 博客访问: 841823
  • 博文数量: 372
  • 博客积分: 10063
  • 博客等级: 中将
  • 技术积分: 4220
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-24 11:36
文章分类

全部博文(372)

文章存档

2012年(372)

分类: 虚拟化

2012-04-26 20:25:16

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可以帮助你的地方。

 

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

英文链接地址:

 

 

转自:
阅读(850) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~