(依赖注入框架:Ninject ) 一 手写依赖注入
2024-09-06 11:34:22
什么是依赖注入?
这里有一个场景:战士拿着刀去战斗:
刀:
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>
最新文章
- Python基础知识(一)
- EF框架学习
- [.NET] 自己实现任务池(模仿线程池)
- 高校应该使用 Drupal 的10大理由
- POJ 1759
- 欧拉工程第70题:Totient permutation
- [LeetCode OJ]-Climbing Stairs
- Webservice-WSDL详解(三)
- 自定义cell,根据数据源,要对cell的布局进行调整,没有实现调整的相应效果
- 数据降维技术(2)—奇异值分解(SVD)
- Python 3中字符串可以被改变吗?
- J2EE进阶(八)Hibernate与延迟加载机制探究
- form组件
- Jenkins + Gerrit + Git
- iOS 【终极方案】精准获取webView内容高度,自适应高度
- [osg][opengl]透视投影的参数Perspective
- [leetcode]428. Serialize and Deserialize N-ary Tree序列化与反序列化N叉树
- Struts框架核心工作流程与原理
- python面试十题
- [attribute |= value] 与 [attribute ^= value],[attribute ~= value] 与 [attribute *= value] 的联系与区别
热门文章
- Front Page
- velocity 相关
- D3.js 区域生成器 (V3版本)
- linux 下安装mysql5.7.17
- css盒子模型概念
- cin,cout优化
- Redis探索之路(一):Redis简介
- NX二次开发-创建CSYS坐标系UF_CSYS_create_csys
- NX二次开发-UFUN CSYS坐标系转换UF_CSYS_map_point
- NX二次开发-UFUN获取图层的状态UF_LAYER_ask_status