Ioc和DI之间的关系(依赖注入的核心概念)
1.开篇闲话
由于之前做的很多项目都没接触到这个,后来到了另一个公司,他们的代码结构是基于领域驱动设计的,其中里面的对象都是通过依赖注入方式(Sprint.NET)实现的,也大致了解了哈,在网上搜了些资料来理解,网上有很多实现依赖注入的框架有很多,比如astle Windsor、Unity、Spring.NET、StructureMap,后续会对Unity和Spring.NET做介绍,以及自己用反射来实现各种方式的依赖注入。
2.原来你们是一家人
控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,它还有种叫法是依赖注入DI(Dependency Injection)。IoC是一种设计模式,是一种思想,相当于一个容器,而DI就好比是实现IOC的一种方式。所谓依赖注入,就是由IoC容器在运行期间,动态地将某种依赖关系注入到对象之中。这些是我的个人理解哈,如有不对的地方,还请大神些指导哈!
3.DI的实现方式(后续都会对各个注入方式做代码展示的)
构造器注入(Constructor Injection):Ioc容器会智能地选择选择和调用合的构造函数以创建依赖的对象。如果被选择的构造函数具有相应的参数,Ioc容器在调用构造函数之前解析注册的依赖关系并自行获得相应参数对象;
属性注入(Property Injection):如果需要使用到被依赖对象的某个属性,在被依赖对象被创建之后,Ioc容器会自动初始化该属性;
方法注入(Method Injection):如果被依赖对象需要调用某个方法进行相应的初始化,在该对象创建之后,Ioc容器会自动调用该方法。
4.实例展示
就拿成都车展来说嘛,高科技的东西多,尤其是虚拟现实的体检,很带劲得。车展中有很多车展商,每个车展商有不同的车型,车展中的游客有要买车的和不买车的。根据这种情况做一下代码的实现:
//人接口
public interface IPeople
{
void ViewCare();
}
//要买车的人
public class PeopleWithBuyCar : IPeople
{
//可以通过注入实现指定的汽车服务商
private ICarVender carVender = null;
public PeopleWithBuyCar(ICarVender carVender)
{
this.carVender = carVender;
}
public void ViewCare()
{
ICar car = carVender.SaleCar();
Console.WriteLine("汽车代号:" + car.carName + ",售价" + car.carPrice);
}
}
//汽车厂商接口
public interface ICarVender
{
ICar SaleCar();
}
//大众厂商
public class DaZhong : ICarVender
{
//可以通过注入实现指定的汽车服务商
private ICar car = null;
public DaZhong(ICar car)
{
this.car = car;
}
public ICar SaleCar()
{
return car;
}
}
//汽车接口
public interface ICar
{
string carName { get; }
double carPrice { get; }
}
//具体汽车信息
public class DaZhongCar : ICar
{
public string carName
{
get
{
return "大众";
}
} public double carPrice
{
get
{
return ;
}
}
}
从上面的代码可以看出,PeopleWithBuyCar依赖接口ICarVender、ICar,DaZhong依赖ICarVender和ICar,Car依赖ICar,这样就符合依赖倒置原则了,都是依赖于对象的抽象,从而降低耦合度,方便后期的扩展。这里还没说对象的注入,可以简单的说一下,比如PeopleWithBuyCar类 需要依赖ICarVender接口,但是具体是ICarVender接口的哪一个实现类,就是通过注入来完成的,可以把DaZhong类对象注入给ICarVender,这样就比较灵活,控制起来相对方便点。
5.小结
上面只是简单的介绍了哈,也没给过多的代码的,后面再具体介绍每一种注入方式的时候,再详细的说!谢谢大家咯!
Ioc和DI之间的关系(依赖注入的核心概念)的更多相关文章
- IOC和DI 控制反转和依赖注入
首先要分享的是Iteye的开涛这位技术牛人对Spring框架的IOC的理解,写得非常通俗易懂,以下内容全部来自原文,原文地址:http://jinnianshilongnian.iteye.com/b ...
- 小白初学Ioc、DI、Castle Windsor依赖注入,大神勿入(不适)
过了几天,我又来了.上一篇中有博友提到要分享下属于我们abp初学者的历程,今天抽出点时间写写吧.起初,我是直接去看阳光铭睿的博客,看了一遍下来,感觉好多东西没接触过,接着我又去下了github 里面下 ...
- [.net 面向对象程序设计深入](26)实战设计模式——使用Ioc模式(控制反转或依赖注入)实现松散耦合设计(1)
[.net 面向对象程序设计深入](26)实战设计模式——使用IoC模式(控制反转或依赖注入)实现松散耦合设计(1) 1,关于IOC模式 先看一些名词含义: IOC: Inversion of con ...
- [.net 面向对象程序设计深入](31)实战设计模式——使用Ioc模式(控制反转或依赖注入)实现松散耦合设计(1)
[.net 面向对象程序设计深入](31)实战设计模式——使用IoC模式(控制反转或依赖注入)实现松散耦合设计(1) 1,关于IOC模式 先看一些名词含义: IOC: Inversion of con ...
- IOC/DI控制反转与依赖注入
IOC/DI控制反转与依赖注入 IOC和DI表现的效果的是一样的只不过对于作用的对象不同,有了不一样的名字. 先用一个现实的例子来说明IOC/DI表现出来的效果.
- Spring IOC源代码具体解释之容器依赖注入
Spring IOC源代码具体解释之容器依赖注入 上一篇博客中介绍了IOC容器的初始化.通过源代码分析大致了解了IOC容器初始化的一些知识.先简单回想下上篇的内容 加载bean定义文件的过程.这个过程 ...
- UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现
UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现 类与类图 1) 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性.操作.关系的对象集合的总称. 2) 在系统中, ...
- UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现(转)
UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现 类与类图 1) 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性.操作.关系的对象集合的总称. 2) 在系统 ...
- 工厂方法模式与IoC/DI控制反转和依赖注入
IoC——Inversion of Control 控制反转 DI——Dependency Injection 依赖注入 要想理解上面两个概念,就必须搞清楚如下的问题: 参与者都有谁? 依赖:谁 ...
随机推荐
- Linux性能优化从入门到实战:13 内存篇:内存指标/工具总结、问题定位和调优
内存性能指标 系统内存指标 已用内存和剩余内存很容易理解,就是已经使用和还未使用的内存. 共享内存是通过 tmpfs 实现的,所以它的大小也就是 tmpfs 使用的内存大小.tmpfs 其实也是一种特 ...
- shell脚本--expect自动应答
expect自动应答 TCL语言 需求1:远程登录到A主机,什么事情也不做 #! /usr/bin/env expect # 开启一个程序 spawn ssh root@192.144.213.11 ...
- CSS3选择器 :read-only选择器 CSS3选择器 :read-write选择器
CSS3选择器 :read-only选择器 “:read-only”伪类选择器用来指定处于只读状态元素的样式.简单点理解就是,元素中设置了“readonly=’readonly’” 示例演示 通过“: ...
- Tenka1 Programmer Contest D - Crossing
链接 Tenka1 Programmer Contest D - Crossing 给定\(n\),要求构造\(k\)个集合\({S_k}\),使得\(1\)到\(n\)中每个元素均在集合中出现两次, ...
- POJ 3889 Fractal Streets(逼近模拟)
$ POJ~3889~Fractal~Streets $(模拟) $ solution: $ 这是一道淳朴的模拟题,最近发现这种题目总是可以用逼近法,就再来练练手吧. 首先对于每个编号我们可以用逼近法 ...
- CSS多列布局(栅格布局)
一.多列布局 CSS3 可以将文本内容设计成像报纸一样的多列布局,如下实例: 代码如下(具体的解释也在代码中)浏览器支持表格中的数字表示支持该方法的第一个浏览器的版本号. 紧跟在数字后面的 -webk ...
- 给mongodb设置密码
内容来自:https://segmentfault.com/a/1190000011554055 mongodb安装后是无需密码 Mongodb安装后自身是没有密码的,用户连接只需填写id地址,端口号 ...
- LA 6834 Shopping
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...
- Dubbo学习-8-dubbo启动时检查
启动时检查的作用如下: (1)Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 Spring 初始化完成,以便上线时,能及早发现问题,默认 check="true& ...
- Gym - 101194H Great Cells
Problem H. Great Cells 题目链接:https://codeforces.com/gym/101194/attachments Input file: Standard Input ...