博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IOC
阅读量:6170 次
发布时间:2019-06-21

本文共 2618 字,大约阅读时间需要 8 分钟。

 

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 ICarVender23     {24         ICar SaleCar();25     }26     //大众厂商27     public class DaZhong : ICarVender28     {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 ICar42     {43         string carName { get; }44         double carPrice { get; }45     }46     //具体汽车信息47     public class DaZhongCar : ICar48     {49         public string carName50         {51             get52             {53                 return "大众";54             }55         }56 57         public double carPrice58         {59             get60             {61                 return 180000;62             }63         }64     }

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

5.依赖注入分为:构造函数注入,属性注入,接口注入

   通过构造函数注入就可以减少对象的声明,可以在写构造函数时,把要用的类作为构造函数的参数传进来,再在构造函数中进行赋值操作。

 
 

转载于:https://www.cnblogs.com/yanyao/p/4819373.html

你可能感兴趣的文章
MySQL 5.7.5 : GTID_EXECUTED系统表
查看>>
Hybrid框架UI重构之路:四、分而治之
查看>>
【原创】Valgrind 基础
查看>>
Es6系列之destructuring assignments
查看>>
CSS ID选择器与CLASS选择器
查看>>
mysql 索引B-Tree类型对索引使用的生效和失效情况详解
查看>>
指针的看法
查看>>
Cocos-2d 坐标系及其坐标转换
查看>>
LAMP网站的CACHE机制概要
查看>>
[MySQL 5.6] 5.6新参数slave_rows_search_algorithms
查看>>
ESXi5.1嵌套KVM虚拟化环境支持配置
查看>>
爬虫的小技巧之–如何寻找爬虫入口
查看>>
JVM学习(二)垃圾收集器
查看>>
为hexo博客添加基于gitment评论功能
查看>>
java 库存 进销存 商户 多用户管理系统 SSM springmvc 项目源码
查看>>
Flutter - Drawer 抽屉视图与自定义header
查看>>
ERP系统的优势_库存管理软件开发
查看>>
如何内行地评价公链(一)从真正的不可能三角谈起
查看>>
BigDecimal 详解
查看>>
Shell实战之函数的高级用法
查看>>