学习笔记--DI(依赖注入) 、Ioc(控制反转)
一、概述
日期:2013-12-12
今天主要研究的是依赖注入(Dependency Injection),感觉收获很多,特别在思想上。
本人技术有限,有兴趣的朋友可以看一下文章:
①http://blog.csdn.net/wanghao72214/article/details/3969594;
②http://www.cnblogs.com/leoo2sk/archive/2009/06/17/1504693.html;
③http://baitai.iteye.com/blog/792980。
二、简介
说到依赖注入(DI),变让我想起了facade模型。这是我第一次接触到DI,于是就研究了下它。
在DI出现之前,出现了控制反转(Ioc),个人感觉它们是一样的。
以面向对象开发的软件中,实现各业务或功能,我们往往需要很多类相互配合,这样类之间的耦合度很高,
Ioc的出现就是为了解决或减少这种耦合,使得彼此之间相互独立。
实现这种技术,我们需要借助一个第三方“容器”,来“粘合”各部分组件,让他们相互运转起来。
具体详情请见上文章,下面讲下个人理解后的小例子。
三、举例
比如:现有A类(Mp3)和B类(耳机),现在想用Mp3听音乐,我们需要调用耳机中的发声方法
此时,A依赖于B的方法,A想实现听音乐的功能,就必须先示例化B的一个对象,然后通过B调用发声方法
//假设为耳机类,播放音乐
public class B
{
public void SoundRreproduction()
{
console.writeLine("我要播放音乐啦");
}
}
public class B
public class A
{
B b=new B();
b.SoundReproduction();
//可以看出,A想完成该功能,必须先new 一个B对象,
//注意,此时是A主动new的B,所有控制权在A上,A是主动(控制反转)
}
public class A
这是一般的写法,这种写法的坏处就是,当我们改了B之后,A也要相应的修改,如换个耳机C,这A要new个C出来
下面看我们是怎样一步一步的摆脱这种耦合,使得跟换耳机后,A可以不用动。
//为观看方便,我把这几个类写在了一个地方,不推荐这样做 //定义一个耳机接口
public Interface IB
{
//依然是发声方法,偷个懒
void SR();
} //B类继承了IB这个耳机接口,并实现了它的SR方法
public class B:IB
{
public void SR()
{
console.wirteline("我要听音乐啦");
}
} public class A
{
IB b=new B();
b.SR();
//好,我们可以看到,现在的b已经不是B类了,它的本质是一个接口
//这是我们解耦的第一步
}
解耦第一步
//上面虽然没有了B类,但依然需要new一个B出来这不是我们想要的 //定义一个耳机接口
public Interface IB
{
void SR();
} //B类继承了IB这个耳机接口,并实现了它的SR方法
public class B:IB
{
public void SR()
{
console.wirteline("我要听音乐啦");
}
}
/*===========晕割线:上面都没变=============*/
//我们在这里定义了一个耳机工厂,用来生成IB
public class BFactory
{
//返回一个IB接口实现类的对象
public static IB CreateIBImp()
{
return new B();
}
} public class A
{
IB b=BFactory.CreateIBImp();
b.SR();
} //到了这里,我们在A中真的看不到B了,只不过当我们换耳机的时候,//要到耳机工厂中改方法这也是不符合OCP原则的
解耦第二步
//上面虽然没有“成功”,但是,此时A的已经不需要new一个B了,此时它//对于B的控制权交个了工厂,当它需要B时,工厂给它创建一个B,然后//注入到A里,这便是控制反转或依赖注入
public Interface IB
{
void SR();
}
public class B:IB
{
public void SR()
{
console.wirteline("我要听音乐啦");
}
}
/*==========晕割线=============*/
/
//工厂也不行,学过编程的都知道反射,我们下面用反射看看 public class A
{
MyIocContainer.Load("DI.config");
IB b=MyIocContainer.Get<IB>();
b.SR();
} //当我们完成者一步的时候,再次更换耳机C已经不需要改变,只需要
//添加(和修改是两码事)一个C继承IB接口,并实现它的方法就行了
解耦第三步
public class MyIocContainer
{
private static string interface;
private static string implementation; //加载配置文档
public static void Load (string configFile)
{
XmlDocument xmlDoc=new XmlDocument();
xmlDoc.Load(configFile); XmlNode node=doc.SelectSingleNode(@"DIObjects/IBConfig")
interface=node.Attributes["interface"].value;
implementation=node.Attributes["implementation"].value;
} //反射
public static T Get<T>()
{
//获取接口实例的类型
Type impType=Type.GetType(implementation);
object instance=Activator.CreateInstance(impType);
return (T)instance;
}
}
MyIocContainer
<?xml version="1.0"?>
<DIObject>
<IBconfig name="headset" interface="IB" implementation="B" ></IBconfig>
</DIObject>
DI.config
学习笔记--DI(依赖注入) 、Ioc(控制反转)的更多相关文章
- 大话DI依赖注入+IOC控制反转(一) 之 定义
转发时请注明原创作者及地址,否则追究责任.原创:alunchen 依赖注入与控制反转 依赖注入与控制反转是老生常谈的问题.一般面试也会面试到这种问题.网上很多很多这方面的资料,搜索出来一大堆 ...
- DI依赖注入/IOC控制反转
DI依赖注入# 啥都不说,直接上代码 <?php class UserController { private $user; function __construct(UserModel $us ...
- 大话DI依赖注入+IOC控制反转(二) 之 浅析.Net Core中的DI与IOC
转发时请注明原创作者及地址,否则追究责任.原创:alunchen 在上一篇文章中,我们聊了很多关于定义的方面,比较孤燥,下面我们结合.Net Core聊一下依赖注入&控制反转. 三种对象生 ...
- 轻松学,浅析依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI) 依赖注入和控制反转的理解,写的太好了。
轻松学,浅析依赖倒置(DIP).控制反转(IOC)和依赖注入(DI) 2017年07月13日 22:04:39 frank909 阅读数:14269更多 所属专栏: Java 反射基础知识与实战 ...
- angular2 学习笔记 ( DI 依赖注入 )
refer : http://blog.thoughtram.io/angular/2016/09/15/angular-2-final-is-out.html ( search Dependency ...
- Asp.net core 学习笔记 ( DI 依赖注入 )
比起 Angular 的依赖注入, core 的相对简单许多, 容易明白 所有 provider 都在 startup 里配置. public void ConfigureServices(IServ ...
- 浅谈(IOC)依赖注入与控制反转(DI)
前言:参考了百度文献和https://www.cnblogs.com/liuqifeng/p/11077592.html以及http://www.cnblogs.com/leoo2sk/archive ...
- Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->Spring Framework的依赖注入和控制反转
Dependency Injection and Inversion of Control 1.概述: 1.1相关概念 bean:由IoC容器所管理的对象,也即各个类实例化所得对象都叫做bean 控制 ...
- 谈谈php依赖注入和控制反转
要想理解php依赖注入和控制反转两个概念,就必须搞清楚如下的问题: DI--Dependency Injection 依赖注入 IoC--Inversion of Control 控制反转 1. ...
- 【AutoFac】依赖注入和控制反转的使用
在开始之前首先解释一下我认为的依赖注入和控制反转的意思.(新手理解,哪里说得不正确还请指正和见谅) 控制反转:我们向IOC容器发出获取一个对象实例的一个请求,IOC容器便把这个对象实例“注入”到我们的 ...
随机推荐
- WPF中的布局控件(转)
WPF中使用Panel进行页面布局,Panel是一个抽象类,它作为所有Panel面板控件的基类.Panel并不是继承自Control类,而是直接从FrameworkElement继承.看Panel的继 ...
- MySQL函数笔记
MySQL函数笔记 日期函数 SELECT t1.xcjyrq, t1.* FROM view_sbxx t1 WHERE t1.syzt ; SELECT t1.xcjyrq, t1.* FROM ...
- hadoop笔记之Hive的数据存储(桶表)
Hive的数据存储(桶表) Hive的数据存储(桶表) 桶表 桶表是对数据进行哈希取值,然后放到不同文件中存储. 比如说,创建三个桶,而创建桶的原则可以按照左边表中学生的名字来创建对应的桶.这样子把左 ...
- codeforces 645C . Enduring Exodus 三分
题目链接 我们将所有为0的位置的下标存起来. 然后我们枚举左端点i, 那么i+k就是右端点. 然后我们三分John的位置, 找到下标为i时的最小值. 复杂度 $ O(nlogn) $ #include ...
- C语言struct类型
在实际问题中,一组数据往往具有不同的数据类型.例如, 在学生登记表中,姓名应为字符型:学号可为整型或字符型: 年龄应为整型:性别应为字符型:成绩可为整型或实型. 显然不能用一个数组来存放这一组数据. ...
- 【Windows 8 Store App】学习:目录
原文http://www.cnblogs.com/java-koma/archive/2013/05/22/3093302.html 写在前面:我之前从事java开发,对MS的一整套东西还没入门哈,难 ...
- E=MC2 - 搜搜百科
E=MC2 - 搜搜百科 1 E=MC2 质能等价理论是爱因斯坦狭义相对论的最重要的推论,即著名的方程式E=mC^2,式中E为能量,m为质量,C为光速:也就是说,一切物质都潜藏着质量乘于光速平方的能量 ...
- Go语言简单的TCP编程
前期准备 需要import "net"包 IP类型,其中一个重要的方法是IP.ParseIP(ipaddr string)来判断是否是合法的IP地址 TCP Client func ...
- android中退出当前应用程序的四种方法
android中退出当前应用程序的四种方法 [IT168 技术]Android程序有很多Activity,比如说主窗口A,调用了子窗口B,如果在B中直接finish(), 接下里显示的是A.在B中如何 ...
- asp.net弹出多个模态窗口
asp.net中无限制弹出模态窗口 特点: 1. 可以在模态窗口上再弹出模态窗口,不限制次数 2. 弹出窗口的支持拖放,及调整大小 3. 弹出窗口关闭后可以动态控制 ...