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.实例展示

就拿成都车展来说嘛,高科技的东西多,尤其是虚拟现实的体检,很带劲得。车展中有很多车展商,每个车展商有不同的车型,车展中的游客有要买车的和不买车的。根据这种情况做一下代码的实现:

 1  //人接口
 2     public interface IPeople
 3     {
 4         void ViewCare();
 5     }
 6     //要买车的人
 7     public class PeopleWithBuyCar : IPeople
 8     {
 9         //可以通过注入实现指定的汽车服务商
10         private ICarVender carVender = null;
11         public PeopleWithBuyCar(ICarVender carVender)
12         {
13             this.carVender = carVender;
14         }
15         public void ViewCare()
16         {
17             ICar car = carVender.SaleCar();
18             Console.WriteLine("汽车代号:" + car.carName + ",售价" + car.carPrice);
19         }
20     }
21     //汽车厂商接口
22     public interface ICarVender
23     {
24         ICar SaleCar();
25     }
26     //大众厂商
27     public class DaZhong : ICarVender
28     {
29         //可以通过注入实现指定的汽车服务商
30         private ICar car = null;
31         public DaZhong(ICar car)
32         {
33             this.car = car;
34         }
35         public ICar SaleCar()
36         {
37             return car;
38         }
39     }
40     //汽车接口
41     public interface ICar
42     {
43         string carName { get; }
44         double carPrice { get; }
45     }
46     //具体汽车信息
47     public class DaZhongCar : ICar
48     {
49         public string carName
50         {
51             get
52             {
53                 return "大众";
54             }
55         }
56
57         public double carPrice
58         {
59             get
60             {
61                 return 180000;
62             }
63         }
64     }

从上面的代码可以看出,PeopleWithBuyCar依赖接口ICarVender、ICar,DaZhong依赖ICarVender和ICar,Car依赖ICar,这样就符合依赖倒置原则了,都是依赖于对象的抽象,从而降低耦合度,方便后期的扩展。这里还没说对象的注入,可以简单的说一下,比如PeopleWithBuyCar类  需要依赖ICarVender接口,但是具体是ICarVender接口的哪一个实现类,就是通过注入来完成的,可以把DaZhong类对象注入给ICarVender,这样就比较灵活,控制起来相对方便点。

5.小结

   上面只是简单的介绍了哈,也没给过多的代码的,后面再具体介绍每一种注入方式的时候,再详细的说!谢谢大家咯!

时间: 2024-10-10 11:52:53

Ioc和DI之间的关系(依赖注入的核心概念)的相关文章

小白初学Ioc、DI、Castle Windsor依赖注入,大神勿入(不适)

过了几天,我又来了.上一篇中有博友提到要分享下属于我们abp初学者的历程,今天抽出点时间写写吧.起初,我是直接去看阳光铭睿的博客,看了一遍下来,感觉好多东西没接触过,接着我又去下了github 里面下了几个例子来看,看起来还是有点吃力,毕竟我只用过MVC3和asp.net4.0以及EntityFramework3.5 ,突然感觉自己好像跟世界脱轨了,什么IOC只是听老师提过,当时不知道有什么用就没怎么听,AutoMapper,AngularJS,Less什么的没听过.没办法,只好先去一个一个把他

IOC/DI控制反转与依赖注入

IOC/DI控制反转与依赖注入 IOC和DI表现的效果的是一样的只不过对于作用的对象不同,有了不一样的名字. 先用一个现实的例子来说明IOC/DI表现出来的效果. 上图,小冬的有一个吃的功能,营养师要求小冬要吃土豆,这个过程有很大的局限,也就是对于营养师来说,这个营养师只能要求小冬,并且还只能吃土豆,显然一个营养师只能给一个人去搭配营养,并且还然人家只能吃土豆,这样显然不可以!所以对此做个改进: 这一次营养师可以要求任何用能力吃的人,只要有能力吃,也就是实现吃的这一个能力人,就可以被营养师来要求

Spring IOC源代码具体解释之容器依赖注入

Spring IOC源代码具体解释之容器依赖注入 上一篇博客中介绍了IOC容器的初始化.通过源代码分析大致了解了IOC容器初始化的一些知识.先简单回想下上篇的内容 加载bean定义文件的过程.这个过程是通过BeanDefinitionReader来完毕的.当中通过 loadBeanDefinition()来对定义文件进行解析和依据Spring定义的bean规则进行处理 - 其实和Spring定义的bean规则相关的处理是在BeanDefinitionParserDelegate中完毕的,完毕这个

UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现

类与类图 1) 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性.操作.关系的对象集合的总称. 2) 在系统中,每个类具有一定的职责,职责指的是类所担任的任务,即类要完成什么样的功能,要承担什么样的义务.一个类可以有多种职责,设计得好的类一般只有一种职责,在定义类的时候,将类的职责分解成为类的属性和操作(即方法). 3) 类的属性即类的数据职责,类的操作即类的行为职责 一.依赖关系(Dependence) 依赖关系(Dependence):假设A类的变化引起了B类的变

工厂方法模式与IoC/DI控制反转和依赖注入

IoC——Inversion of Control  控制反转 DI——Dependency Injection   依赖注入 要想理解上面两个概念,就必须搞清楚如下的问题: 参与者都有谁? 依赖:谁依赖于谁?为什么需要依赖? 注入:谁注入于谁?到底注入什么? 控制反转:谁控制谁?控制什么?为何叫反转(有反转就应该有正转了)? 依赖注入和控制反转是同一概念吗? 下面就来简要的回答一下上述问题,把这些问题搞明白了,IoC/DI也就明白了.(1)参与者都有谁: 一般有三方参与者,一个是某个对象:一个

IoC容器Autofac正篇之依赖注入(六)

依赖注入,这个专业词我们可以分为两个部分来理解: 依赖,也就是UML中描述事物之间关系的依赖关系,依赖关系描述了事物A在某些情况下会使用到事物B,事物B的变化会影响到事物A: 注入,医生通过针头将药物注入到病人体内.注入也就是由外向内注入.灌输一些东西. 综合上面的说明,依赖注入就是A类依赖B类,B类的实例由外部向A注入而不是由A自己进行实例化或初始化. 三种注入方式 一.构造器注入   类A依赖于类B,类A的构造方法中,有一个参数为类B,在new 类A时会从外部为类B传入实例就是构造注入 cl

SpringMVC 源代码深度解析 IOC容器(Bean实例化和依赖注入)

SpringMVC最核心的IOC的控制反转,动态的向某个对象提供它所需要的其他对象,例如:对象A时,需要对象B时,这时不像以前我们之前要在A对象里实例化B对象,这时B对象的实例化由IOC容器会主动创建一个对象B然后注入到对象A里,提供使用.我们项目开发中,最经常用到,那怎么实现实例Bean并依赖注入呢?我们今天带着这些问题来通过SpringMVC源代码进行深入的解析.这篇介绍不对注解实例化和注入进行讲解,这个放在后面在介绍. 我们平常写的一个类,并依赖调用了类的某个方法,这时需要依赖那个类已经实

Spring之对象依赖关系(依赖注入Dependency Injection)

承接上篇: Spring中,如何给对象的属性赋值: 1:通过构造函数,如下所示: <!-- 1:构造函数赋初始值 --><bean id="user1" class="com.bie.po.User"><constructor-arg value="10010" type="int"></constructor-arg>      <constructor-arg valu

继承和派生(1)—— 类与类之间的关系、继承的基本概念

1.类与类之间的关系 has-A,uses-A 和 is-A has-A 包含关系,用以描述一个类由多个"部件类"构成.实现has-A关系用类成员表示,即一个类中的数据成员是另一种已经定义的类. uses-A 一个类部分地使用另一个类.通过类之间成员函数的相互联系,定义友员或对象参数传递实现. is-A 机制称为"继承".关系具有传递性,不具有对称性. class A { public: void funcA() { } int a; }; //类B拥有类A的成员变