依赖注入分享

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

2020/1/61依赖注入分享人:王蕊2DI——DependencyInjection依赖注入:IoC——InversionofControl控制反转:两个名词:3我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。就像手表齿轮的啮合,软件系统中对象之间的耦合关系与之非常相似。对象之间耦合度过高的系统,必然会出现牵一发而动全身的情形。2020/1/64如何降低系统之间、模块之间和对象之间的耦合度,是软件工程永远追求的目标之一。软件专家MichaelMattson提出了IOC理论IOC理论提出的观点大体是这样的:借助于“第三方”实现具有依赖关系的对象之间的解耦.。2020/1/65IOC解耦过程分析:齿轮之间的传动全部依靠“第三方”了,全部对象的控制权全部上缴给“第三方”IOC容器,所以,IOC容器成了整个系统的关键核心,它起到了一种类似“粘合剂”的作用,把系统中的所有对象粘合在一起发挥作用。2020/1/66拿掉IoC容器后的系统A、B、C、D这4个对象之间已经没有了耦合关系,彼此毫无联系,当实现A的时候,根本无须再去考虑B、C和D了,对象之间的依赖关系已经降低到了最低程度。2020/1/67常规A使用C示意图A类不再主动创建C2020/1/68控制反转(IOC)为什么要起这么个名字?通过前后的对比,我们不难看出来:对象A获得依赖对象B的过程,由主动行为变为了被动行为,控制权颠倒过来了,这就是“控制反转”这个名称的由来。2020/1/69IOC的别名:依赖注入(DI)2004年,MartinFowler探讨了同一个问题,既然IOC是控制反转,那么到底是“哪些方面的控制被反转了呢?”最后,他得出了答案:“获得依赖对象的过程被反转了”。控制被反转之后,获得依赖对象的过程由自身管理变为了由IOC容器主动注入。于是,他给“控制反转”取了一个更合适的名字叫做“依赖注入”2020/1/610所以,依赖注入(DI)和控制反转(IOC)是从不同的角度的描述的同一件事情,就是指通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦。2020/1/611依赖注入的方法:Setter注入Setter注入(SetterInjection)是指在客户类中,设置一个服务类接口类型的数据成员,并设置一个Set方法作为注入点,这个Set方法接受一个具体的服务类实例为参数,并将它赋给服务类接口类型的数据成员。2020/1/612构造注入构造注入(ConstructorInjection)是指在客户类中,设置一个服务类接口类型的数据成员,并以构造函数为注入点,这个实例为参数,并将它赋给服务类接口类构造函数接受一个具体的服务类型的数据成员。2020/1/613统一建模语言(UML)是建模语言,其核心就是把软件的设计思想通过建模的方法表达出来。故非常适合于表达设计模式。同时UML已经被广泛用于软件设计,这也推动了设计模式的应用。2020/1/614IOC/DI为我们带来了什么好处?1.可维护性比较好,非常便于进行单元测试,便于调试程序和诊断故障。2.很容易将一个大的任务划分为细小的任务,开发效率和产品质量必将得到大幅度的提高。3.可复用性好4.更换一个实现子类将会变得很简单,只要修改配置文件就可以了FH2020/1/615IOC容器的一些产品重量级IoCContainer所谓重量级IoCContainer,是指一般用外部配置文件(一般是XML)作为依赖源,并托管整个系统各个类的实例化的IoCContainer。这种IoCContainer,一般是承接了整个系统几乎所有多态性的依赖注入工作,并承接了所有服务类的实例化工作.Spring和Spring.NET是重量级IoCContainer的例子。轻量级IoCContainer还有一种IoCContainer,一般不依赖外部配置文件,而主要使用传参的Setter或Construtor注入,这种IoCContainer叫做轻量级IoCContainer。Unity是一个典型的轻量级IoCContainer。2020/1/616比较知名的IoC容器有:PicoContainer、Avalon、Spring、JBoss、HiveMind、EJB等。上面的几个IoC容器中,轻量级的有PicoContainer、Avalon、Spring、HiveMind等,超重量级的有EJB,而半轻半重的有容器有JBoss,Jdon等。2020/1/617Spring是一个开源框架。它是为了解决企业应用开发的复杂性而创建的。Spring框架由七个定义明确的模块组成2020/1/618核心容器这是Spring框架最基础的部分,它提供了依赖注入(DependencyInjection)特征来实现容器对Bean的管理。这里最基本的概念是BeanFactory,它是任何Spring应用的核心。BeanFactory是工厂模式的一个实现,它使用IoC将应用配置和依赖说明从实际的应用代码中分离出来。bean就相当于定义一个组件,这个组件是用于具体实现某个功能的。这里的所定义的bean就相当于给了你一个简洁方便的方法来调用这个组件实现你要完成的功能。2020/1/619.Net中实现控制翻转和依赖注入的方法1.通过微软官方的Unity下载地址:使用介绍:.NET使用unity实现依赖注入2.使用框架spring.net下载地址:使用介绍:.NET使用spring.net实现依赖注入3.使用框架Autofac下载地址:使用介绍:.NET使用Autofac实现依赖注入当然了,实现依赖注入还有其他框架,比如:Castle和Ninject等2020/1/6201:本实例将通过一个简单的三层演示使用Unity实现依赖注入,并把相应的具体实例写入在配置文件里,达到后期可能方便修改;首先看一下实例分层的情况:UnityIAopDAL-数据接口层(类库)[AopDALAopOracelDAL]-分别实现数据接口的数据层(类库)IAopBLL-逻辑接口层(类库)AopBLL-实现逻辑接口层(类库)AopUnity-主程序层Command-公共助手层(类库)2020/1/6212:其中Command我们简单编写一个实现Unity助手的类;首先要引用几个Unity的DLL文件;3:AopDAL、AopOracelDAL是两个实现不同功能的类库,在这我们就比喻成一个插入MSSQL数据库,另外一个就是插入Oracel数据库;其中AopBLL我们没有直接引用具体的AopDAL数据层,而是引用其对应接口层;主程序AopUnity同样也没有具体的BLL层,也是引用其BLL接口层;把接口对应的具体层类写入到配置文件里,做到依赖注入,只要简单修改配置文件就可以达到修改调用;因为AopDAL、AopOracelDAL、AopBLL我们都没有直接引用,所以在生成DLL后是不会保存在主程序的bin里面,所以我们要修改这三个生成的路径;2020/1/6221:IAopDAL层我们只简单创建一个IReadData类代码:usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceIAopDAL{publicinterfaceIReadData{stringReadDataStr(stringName);}}2020/1/6232:AopDAL实现接口层IAopDALusingIAopDAL;namespaceAopDAL{publicclassReadDataDAL:IReadData{publicstringReadDataStr(stringName){returnstring.Format(把{0}写入MSSQL数据库成功,Name);}}}2020/1/6243:AopOracelDAL同样实现IAopDAL层,其功能跟AopDAL一样usingIAopDAL;namespaceAopOracelDAL{publicclassReadDataDAL:IReadData{publicstringReadDataStr(stringName){returnstring.Format(把{0}写入Oracel数据库成功,Name);}}}2020/1/6254:IAopBLL逻辑接口层的内容如下:namespaceIAopBLL{publicinterfaceIReadDataBLL{stringReadDataStr(stringName);}}2020/1/6265:AopBLL层实现IAopBLL接口层,要引用IAopDAL、IAopBLL、Command;usingIAopDAL;usingIAopBLL;usingCommand;namespaceAopBLL{publicclassReadDataBLL:IReadDataBLL{IReadDatabllServer=newUnityContainerHelp().GetServerIReadData();//通过公共助手Command类库调用Unity来实现依赖注入,publicstringReadDataStr(stringName){returnbllServer.ReadDataStr(Name);}}}2020/1/6276:Command公类助手代码,引用几个Unity的命名空间,我们把依赖注入的对象写入在主程序的.config文件里,这边就是通过读取配置文件来查看其对应哪个类库;usingSystem.Text;usingMicrosoft.Practices.Unity;usingMicrosoft.Practices.Unity.Configuration;usingMicrosoft.Practices.Unity.InterceptionExtension;usingMicrosoft.Practices.Unity.InterceptionExtension.Configuration;usingSystem.Configuration;namespaceCommand{publicclassUnityContainerHelp{privateIUnityContainercontainer;publicUnityContainerHelp(){container=newUnityContainer();UnityConfigurationSectionsection=(UnityConfigurationSection)ConfigurationManager.GetSection(unity);container.LoadConfiguration(section,FirstClass);}publicTGetServerT(){returncontainer.ResolveT();}publicTGetServerT(stringName){returncontainer.ResolveT(Name);}}}2020/1/6287:主程序代码:同样只是简单的引用Command、IAopBLL两层;usingCommand;usingIAopBLL;namespaceAopUnity{classProgram{staticvoidMain(string[]args){IReadDataBLLbllServer=newUnityContainerHelp().GetServerIReadDataBLL();Console.Writ

1 / 35
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功