依赖注入分享_第1页
依赖注入分享_第2页
依赖注入分享_第3页
依赖注入分享_第4页
依赖注入分享_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2022/3/81分享人:王蕊分享人:王蕊2DIDependency Injection 依赖注入:依赖注入: IoCInversion of Control控制反转:控制反转:两个名词:两个名词:3我们都知道,在采用面向对象方法设计的软件系统中面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。就像手表齿轮的啮合,软件系统中对象之间的耦合关系软件系统中对象之间的耦合关系与之与之非常相似。对象之间耦合度过高的系统,必然会出现牵一发而动全身的情形。对象之间耦合度过高的系统,必然会出现牵一发而动全身的情形。2022/3/84如何降低系统

2、之间、模块之间和对象之间的耦合度,是软件工程永远追如何降低系统之间、模块之间和对象之间的耦合度,是软件工程永远追求的目标之一。求的目标之一。软件专家软件专家Michael Mattson提出了提出了IOC理论理论IOC理论提出的观点大体是这样的:借助于理论提出的观点大体是这样的:借助于“第三方第三方”实现具有依赖关实现具有依赖关系的对象之间的解耦系的对象之间的解耦.。2022/3/85IOC解耦过程解耦过程分析:分析:齿轮之间的传动全部依靠“第三方”了,全部对象的控制权全部上缴给全部对象的控制权全部上缴给“第三第三方方”IOC容器,所以,容器,所以,IOC容器成了整容器成了整个系统的关键核心,

3、它起到了一种类个系统的关键核心,它起到了一种类似似“粘合剂粘合剂”的作用,把系统中的所有的作用,把系统中的所有对象粘合在一起发挥作用对象粘合在一起发挥作用。2022/3/86拿掉拿掉IoC容器后的系统容器后的系统A、B、C、D这4个对象之间已经没有了耦合关系,彼此毫无联系,当实现当实现A的时候,根本无须再去考虑的时候,根本无须再去考虑B、C和和D了,对象之间的依赖关系已经降低到了,对象之间的依赖关系已经降低到了最低程度。了最低程度。2022/3/87常规A使用C示意图A类不再主动创建C2022/3/88控制反转控制反转(IOC) 为什么要起这么个名字?为什么要起这么个名字?通过前后的对比,通过

4、前后的对比,我们不难看出来:对象A获得依赖对象B的过程,由主动行为变为了被动行为,控制权颠倒控制权颠倒过来了,这就是“控制反转”这个名称的由来。2022/3/89IOC的别名:依赖注入的别名:依赖注入(DI)2004年,Martin Fowler探讨了同一个问题,既然IOC是控制反转,那么到底是“哪些方面的控制被反转了呢?”最后,他得出了答案:“获得依赖对象的过程被反转了获得依赖对象的过程被反转了”。控制被反转之后,获得依赖对象获得依赖对象的过程由自身管理变为了由的过程由自身管理变为了由IOC容器主动注入。容器主动注入。于是,他给“控制反转”取了一个更合适的名字叫做“依赖注入依赖注入”2022

5、/3/810所以,依赖注入所以,依赖注入(DI)和控制反转和控制反转(IOC)是从不同的角度的是从不同的角度的描述的同描述的同一件事情一件事情,就是指通过引入,就是指通过引入IOC容器,利用依赖关系注入的方式,实容器,利用依赖关系注入的方式,实现对象之间的解耦。现对象之间的解耦。2022/3/811依赖注入依赖注入的方法:的方法:Setter注入注入Setter注入(注入(Setter Injection)是)是指在客户类中,设置一个服指在客户类中,设置一个服务类接口类型的数据成员,并设置一个务类接口类型的数据成员,并设置一个Set方法作为注入点方法作为注入点,这个,这个Set方法接受一个具体

6、的服务类实例为参数,并将它方法接受一个具体的服务类实例为参数,并将它赋给服务类接口类型的数据成员。赋给服务类接口类型的数据成员。2022/3/812构造注入构造注入构造注入(构造注入(Constructor Injection)是指在客户类中,是指在客户类中,设置一个服务类接口类型的数据成员,并以构造函数设置一个服务类接口类型的数据成员,并以构造函数为注入点,为注入点,这个实例为参数,并将它赋给服务类接口这个实例为参数,并将它赋给服务类接口类构造函数接受一个具体的服务类型的数据成员。类构造函数接受一个具体的服务类型的数据成员。2022/3/813统一建模语言(UML)是建模语言,其核心就是把软

7、件的设计思想通过建模的方法表达出来。故非常适合于表达设计模式。同时UML已经被广泛用于软件设计,这也推动了设计模式的应用。2022/3/814IOC/DI为我们带来了什么好处为我们带来了什么好处?1.可维护性比较好,非常便于进行单元测试,便于调试程序和诊可维护性比较好,非常便于进行单元测试,便于调试程序和诊断故障。断故障。2.很容易将一个大的任务划分为细小的任务,开发效率和产品质很容易将一个大的任务划分为细小的任务,开发效率和产品质量必将得到大幅度的提高。量必将得到大幅度的提高。3.可复用性好可复用性好4.更换一个实现子类将会变得很简单,只要修改配置文件就可更换一个实现子类将会变得很简单,只要

8、修改配置文件就可以了以了F H 2022/3/815IOC容器的一些产品容器的一些产品重量级重量级IoC Container所谓重量级IoC Container,是指一般用外部配置文件(一般是XML)作为依赖源,并托管整个系统各个类的实例化的IoC Container。这种IoC Container,一般是承接了整个系统几乎所有多态性的依赖注入工作,并承接了所有服务类的实例化工作. Spring和Spring.NET是重量级IoC Container的例子。轻量级轻量级IoC Container还有一种IoC Container,一般不依赖外部配置文件,而主要使用传参的Setter或Const

9、rutor注入,这种IoC Container叫做轻量级IoC Container。Unity是一个典型的轻量级IoC Container。2022/3/816比较知名的IoC容器有:Pico Container、Avalon 、Spring、JBoss、HiveMind、EJB等。上面的几个IoC容器中,轻量级的有Pico Container、Avalon、Spring、HiveMind等,超重量级的有EJB,而半轻半重的有容器有JBoss,Jdon等。2022/3/817 Spring是一个开源框架。它是为了解决企业应用开发的复杂性而创建的。Spring框架由七个定义明确的模块组成2022

10、/3/818核心容器核心容器 这是Spring框架最基础的部分,它提供了依赖注入(Dependency Injection)特征来实现容器对Bean的管理。这里最基本的概念是BeanFactory,它是任何Spring应用的核心。BeanFactory是工厂模式的一个实现,它使用IoC将应用配置和依赖说明从实际的应用代码中分离出来。bean就相当于定义一个组件,这个组件是用于具体实现某个功能的。这里的所定义的bean就相当于给了你一个简洁方便的方法来调用这个组件实现你要完成的功能。2022/3/819.Net中实现控制翻转和依赖注入的方法中实现控制翻转和依赖注入的方法1.通过微软官方的Unit

11、y下载地址:http:/ 使用unity实现依赖注入2.使用框架下载地址:http:/ 使用实现依赖注入3.使用框架Autofac下载地址:http:/ 使用Autofac实现依赖注入当然了,实现依赖注入还有其他框架,比如:Castle和Ninject等2022/3/8201:本实例将通过一个简单的三层演示使用Unity实现依赖注入,并把相应的具体实例写入在配置文件里,达到后期可能方便修改;首先看一下实例分层的情况:UnityIAopDAL-数据接口层数据接口层(类库) AopDAL AopOracelDAL-分别实现数据接口的数据层(类库)IAopBLL-逻辑接口层逻辑接口层(类库) Aop

12、BLL-实现逻辑接口层(类库) AopUnity-主程序层主程序层Command-公共助手层公共助手层(类库)2022/3/8212:其中Command我们简单编写一个实现Unity助手的类;首先要引用几个Unity的DLL文件;3:AopDAL、AopOracelDAL是两个实现不同功能的类库,在这我们就比喻成一个插入MSSQL数据库,另外一个就是插入Oracel数据库;其中其中AopBLL我们没有直接引用具体的我们没有直接引用具体的AopDAL数据层,而是引用其对数据层,而是引用其对应接口层;主程序应接口层;主程序 AopUnity同样也没有具体的同样也没有具体的BLL层,也是引用其层,也

13、是引用其BLL接口层;接口层;把接口对应的具体层类写入到配置文件里,做到依赖注入,只要简单把接口对应的具体层类写入到配置文件里,做到依赖注入,只要简单修改配置文件就可以达到修改调用;修改配置文件就可以达到修改调用;因为AopDAL、AopOracelDAL、AopBLL我们都没有直接引用,所以在生成DLL后是不会保存在主程序的bin里面,所以我们要修改这三个生成的路径;2022/3/8221:IAopDAL层我们只简单创建一个IReadData类代码:using System; using System.Collections.Generic; using System.Linq; using

14、 System.Text; namespace IAopDAL public interface IReadData string ReadDataStr(string Name); 2022/3/8232: AopDAL实现接口层IAopDALusing IAopDAL; namespace AopDAL public classReadDataDAL:IReadData public string ReadDataStr(string Name) return string.Format(把把0写入写入MSSQL数据库成功数据库成功, Name); 2022/3/8243:AopOrace

15、lDAL同样实现IAopDAL层,其功能跟AopDAL一样using IAopDAL; namespace AopOracelDAL public class ReadDataDAL:IReadData public string ReadDataStr(string Name) return string.Format(把把0写入写入Oracel数据库成数据库成功功, Name); 2022/3/8254:IAopBLL逻辑接口层的内容如下:namespace IAopBLL public interface IReadDataBLL string ReadDataStr(string Na

16、me); 2022/3/8265:AopBLL层实现IAopBLL接口层,要引用IAopDAL、IAopBLL、Command;using IAopDAL; using IAopBLL;using Command; namespace AopBLL public class ReadDataBLL:IReadDataBLL IReadData bllServer = new UnityContainerHelp().GetServer();/ 通过公共助手Command类库调用Unity来实现依赖注入,public string ReadDataStr(string Name) return

17、bllServer.ReadDataStr(Name); 2022/3/8276:Command公类助手代码,引用几个Unity的命名空间,我们把依赖注入的对象写入在主程序的.config文件里,这边就是通过读取配置通过读取配置文件来查看其对应哪个类库;文件来查看其对应哪个类库;using System.Text;using Microsoft.Practices.Unity; using Microsoft.Practices.Unity.Configuration; using Microsoft.Practices.Unity.InterceptionExtension;using Mi

18、crosoft.Practices.Unity.InterceptionExtension.Configuration; using System.Configuration; namespace Command public class UnityContainerHelp private IUnityContainer container; public UnityContainerHelp() container = new UnityContainer(); UnityConfigurationSection section = (UnityConfigurationSection)C

19、onfigurationManager.GetSection(unity); container.LoadConfiguration(section, FirstClass); public T GetServer() return container.Resolve(); public T GetServer(string Name) return container.Resolve(Name); 2022/3/8287:主程序代码:同样只是简单的引用Command、IAopBLL两层;using Command; using IAopBLL; namespace AopUnity clas

20、s Program static void Main(string args) IReadDataBLL bllServer = new UnityContainerHelp().GetServer(); Console.WriteLine(bllServer.ReadDataStr(“好好学习好好学习); 2022/3/829我们新建一个App.config文件;其中register 就是我们注入的节点,type为接口层,mapTo则是我们对应的具体实现层,这边也是我们修改配置的地方; 2022/3/830由于经常会在编程时使用到DI,所以出现了一些DI的辅助工具,如Unity和Ninjec

21、t等。由于Ninject的轻量和使用简单,所以选择用它来开发MVC(模型(model)视图(view)控制器(controller)应用程序。下面介绍Ninject,但在这之前,先来介绍一个安装Ninject需要用到的插件-NuGet。2022/3/831NuGet 是一种 Visual Studio 扩展,它能够简化在 Visual Studio 项目中添加、更新和删除库(部署为程序包)的操作。2022/3/832使用使用Ninject的一般步骤的一般步骤在使用Ninject前先要创建创建一个Ninject内核对象class Program static void Main(string a

22、rgs) /创建Ninject内核实例 IKernel ninjectKernel = new StandardKernel(); 使用Ninject内核对象一般可分为两个步骤。第一步是把一个接口(IValueCalculator)绑定绑定到一个实现该接口的类(LinqValueCalculator)./绑定接口到实现了该接口的类 ninjectKernel.Bind().ToLinqValueCalculator(); . 第二步是用Ninject的Get方法去获取IValueCalculator接口的实现。. / 获得实现接口的对象实例 IValueCalculator calcImpl = ninjectKernel.Get(); / 创建ShoppingCart实例并注入依赖 ShoppingCart cart = new ShoppingCart(calcImpl); 2022/3/833但看上去Ninject的使用好像使得编码变

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论