什么是依赖注入?

这里有一个场景:战士拿着刀去战斗:

刀:

class Sword
{
public void Hit(string target)
{
Console.WriteLine($"Chopped {target} clean in half.");
}
}

战士:

class Samurai
{
readonly Sword sword;
public Samurai()
{
this.sword = new Sword();
}
}

战士用刀:

public void Attack(string target)
{
this.sword.Hit(target);
}
}

OK,我们用刀武装了战士

分析:刀和战士是高内聚的,因为战士依赖刀才得以创建,当你想给战士换一个武器的时候,你必须修改战士的实现方法,即构造函数

修正一:使用接口来避免高内聚

武器接口:

interface IWeapon
{
void Hit(string target);
}  

继承接口的刀类:

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

战士类:

class Samurai
{
readonly IWeapon weapon;
public Samurai()
{
this.weapon = new Sword();
}
public void Attack(string target)
{
this.weapon.Hit(target);
}
}

  

分析:现在我们的战士可以武装不同的武器了 ,但是!!这个武器仍然是被创建在战士的构造函数里的,我们还是要改变战士的实现去给他更换武器.战士和武器仍然是高内聚的.

修正二,将武器暴露出来

修正后的战术类:

class Samurai
{
readonly IWeapon weapon;
public Samurai(IWeapon weapon)
{
this.weapon = weapon;
}
public void Attack(string target)
{
this.weapon.Hit(target);
}
}

  

现在我们可以说:我们给战士注入了武器(构造函数注入),不需要修改战士的实现就能给他更换武器

接口化并暴露依赖的实例  这被称作手写依赖注入

But,当你的项目越来越大,对象越来越多,你将花费大量的时间去连接对象,那么,依赖注入库由此而来

来自 <https://github.com/ninject/Ninject/wiki/Dependency-Injection-By-Hand>

最新文章

  1. Python基础知识(一)
  2. EF框架学习
  3. [.NET] 自己实现任务池(模仿线程池)
  4. 高校应该使用 Drupal 的10大理由
  5. POJ 1759
  6. 欧拉工程第70题:Totient permutation
  7. [LeetCode OJ]-Climbing Stairs
  8. Webservice-WSDL详解(三)
  9. 自定义cell,根据数据源,要对cell的布局进行调整,没有实现调整的相应效果
  10. 数据降维技术(2)—奇异值分解(SVD)
  11. Python 3中字符串可以被改变吗?
  12. J2EE进阶(八)Hibernate与延迟加载机制探究
  13. form组件
  14. Jenkins + Gerrit + Git
  15. iOS 【终极方案】精准获取webView内容高度,自适应高度
  16. [osg][opengl]透视投影的参数Perspective
  17. [leetcode]428. Serialize and Deserialize N-ary Tree序列化与反序列化N叉树
  18. Struts框架核心工作流程与原理
  19. python面试十题
  20. [attribute |= value] 与 [attribute ^= value],[attribute ~= value] 与 [attribute *= value] 的联系与区别

热门文章

  1. Front Page
  2. velocity 相关
  3. D3.js 区域生成器 (V3版本)
  4. linux 下安装mysql5.7.17
  5. css盒子模型概念
  6. cin,cout优化
  7. Redis探索之路(一):Redis简介
  8. NX二次开发-创建CSYS坐标系UF_CSYS_create_csys
  9. NX二次开发-UFUN CSYS坐标系转换UF_CSYS_map_point
  10. NX二次开发-UFUN获取图层的状态UF_LAYER_ask_status