版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、2022/4/121分享人:王蕊分享人:王蕊2DIDependency Injection 依賴注入:依賴注入: IoCInversion of Control控制反轉(zhuǎn):控制反轉(zhuǎn):兩個(gè)名詞:兩個(gè)名詞:3我們都知道,在采用面向?qū)ο蠓椒ㄔO(shè)計(jì)的軟件系統(tǒng)中面向?qū)ο蠓椒ㄔO(shè)計(jì)的軟件系統(tǒng)中,它的底層實(shí)現(xiàn)都是由N個(gè)對(duì)象組成的,所有的對(duì)象通過(guò)彼此的合作,最終實(shí)現(xiàn)系統(tǒng)的業(yè)務(wù)邏輯。就像手表齒輪的嚙合,軟件系統(tǒng)中對(duì)象之間的耦合關(guān)系軟件系統(tǒng)中對(duì)象之間的耦合關(guān)系與之與之非常相似。對(duì)象之間耦合度過(guò)高的系統(tǒng),必然會(huì)出現(xiàn)牽一發(fā)而動(dòng)全身的情形。對(duì)象之間耦合度過(guò)高的系統(tǒng),必然會(huì)出現(xiàn)牽一發(fā)而動(dòng)全身的情形。2022/4/124如何降低
2、系統(tǒng)之間、模塊之間和對(duì)象之間的耦合度,是軟件工程永遠(yuǎn)追如何降低系統(tǒng)之間、模塊之間和對(duì)象之間的耦合度,是軟件工程永遠(yuǎn)追求的目標(biāo)之一。求的目標(biāo)之一。軟件專家軟件專家Michael Mattson提出了提出了IOC理論理論IOC理論提出的觀點(diǎn)大體是這樣的:借助于理論提出的觀點(diǎn)大體是這樣的:借助于“第三方第三方”實(shí)現(xiàn)具有依賴關(guān)實(shí)現(xiàn)具有依賴關(guān)系的對(duì)象之間的解耦系的對(duì)象之間的解耦.。2022/4/125IOC解耦過(guò)程解耦過(guò)程分析:分析:齒輪之間的傳動(dòng)全部依靠“第三方”了,全部對(duì)象的控制權(quán)全部上繳給全部對(duì)象的控制權(quán)全部上繳給“第三第三方方”IOC容器,所以,容器,所以,IOC容器成了整容器成了整個(gè)系統(tǒng)的關(guān)鍵
3、核心,它起到了一種類個(gè)系統(tǒng)的關(guān)鍵核心,它起到了一種類似似“粘合劑粘合劑”的作用,把系統(tǒng)中的所有的作用,把系統(tǒng)中的所有對(duì)象粘合在一起發(fā)揮作用對(duì)象粘合在一起發(fā)揮作用。2022/4/126拿掉拿掉IoC容器后的系統(tǒng)容器后的系統(tǒng)A、B、C、D這4個(gè)對(duì)象之間已經(jīng)沒有了耦合關(guān)系,彼此毫無(wú)聯(lián)系,當(dāng)實(shí)現(xiàn)當(dāng)實(shí)現(xiàn)A的時(shí)候,根本無(wú)須再去考慮的時(shí)候,根本無(wú)須再去考慮B、C和和D了,對(duì)象之間的依賴關(guān)系已經(jīng)降低到了,對(duì)象之間的依賴關(guān)系已經(jīng)降低到了最低程度。了最低程度。2022/4/127常規(guī)A使用C示意圖A類不再主動(dòng)創(chuàng)建C2022/4/128控制反轉(zhuǎn)控制反轉(zhuǎn)(IOC) 為什么要起這么個(gè)名字?為什么要起這么個(gè)名字?通過(guò)前后
4、的對(duì)比,通過(guò)前后的對(duì)比,我們不難看出來(lái):對(duì)象A獲得依賴對(duì)象B的過(guò)程,由主動(dòng)行為變?yōu)榱吮粍?dòng)行為,控制權(quán)顛倒控制權(quán)顛倒過(guò)來(lái)了,這就是“控制反轉(zhuǎn)”這個(gè)名稱的由來(lái)。2022/4/129IOC的別名:依賴注入的別名:依賴注入(DI)2004年,Martin Fowler探討了同一個(gè)問題,既然IOC是控制反轉(zhuǎn),那么到底是“哪些方面的控制被反轉(zhuǎn)了呢?”最后,他得出了答案:“獲得依賴對(duì)象的過(guò)程被反轉(zhuǎn)了獲得依賴對(duì)象的過(guò)程被反轉(zhuǎn)了”??刂票环崔D(zhuǎn)之后,獲得依賴對(duì)象獲得依賴對(duì)象的過(guò)程由自身管理變?yōu)榱擞傻倪^(guò)程由自身管理變?yōu)榱擞蒊OC容器主動(dòng)注入。容器主動(dòng)注入。于是,他給“控制反轉(zhuǎn)”取了一個(gè)更合適的名字叫做“依賴注入依賴
5、注入”2022/4/1210所以,依賴注入所以,依賴注入(DI)和控制反轉(zhuǎn)和控制反轉(zhuǎn)(IOC)是從不同的角度的是從不同的角度的描述的同描述的同一件事情一件事情,就是指通過(guò)引入,就是指通過(guò)引入IOC容器,利用依賴關(guān)系注入的方式,實(shí)容器,利用依賴關(guān)系注入的方式,實(shí)現(xiàn)對(duì)象之間的解耦?,F(xiàn)對(duì)象之間的解耦。2022/4/1211依賴注入依賴注入的方法:的方法:Setter注入注入Setter注入(注入(Setter Injection)是)是指在客戶類中,設(shè)置一個(gè)服指在客戶類中,設(shè)置一個(gè)服務(wù)類接口類型的數(shù)據(jù)成員,并設(shè)置一個(gè)務(wù)類接口類型的數(shù)據(jù)成員,并設(shè)置一個(gè)Set方法作為注入點(diǎn)方法作為注入點(diǎn),這個(gè),這個(gè)Se
6、t方法接受一個(gè)具體的服務(wù)類實(shí)例為參數(shù),并將它方法接受一個(gè)具體的服務(wù)類實(shí)例為參數(shù),并將它賦給服務(wù)類接口類型的數(shù)據(jù)成員。賦給服務(wù)類接口類型的數(shù)據(jù)成員。2022/4/1212構(gòu)造注入構(gòu)造注入構(gòu)造注入(構(gòu)造注入(Constructor Injection)是指在客戶類中,是指在客戶類中,設(shè)置一個(gè)服務(wù)類接口類型的數(shù)據(jù)成員,并以構(gòu)造函數(shù)設(shè)置一個(gè)服務(wù)類接口類型的數(shù)據(jù)成員,并以構(gòu)造函數(shù)為注入點(diǎn),為注入點(diǎn),這個(gè)實(shí)例為參數(shù),并將它賦給服務(wù)類接口這個(gè)實(shí)例為參數(shù),并將它賦給服務(wù)類接口類構(gòu)造函數(shù)接受一個(gè)具體的服務(wù)類型的數(shù)據(jù)成員。類構(gòu)造函數(shù)接受一個(gè)具體的服務(wù)類型的數(shù)據(jù)成員。2022/4/1213統(tǒng)一建模語(yǔ)言(UML)是建
7、模語(yǔ)言,其核心就是把軟件的設(shè)計(jì)思想通過(guò)建模的方法表達(dá)出來(lái)。故非常適合于表達(dá)設(shè)計(jì)模式。同時(shí)UML已經(jīng)被廣泛用于軟件設(shè)計(jì),這也推動(dòng)了設(shè)計(jì)模式的應(yīng)用。2022/4/1214IOC/DI為我們帶來(lái)了什么好處為我們帶來(lái)了什么好處?1.可維護(hù)性比較好,非常便于進(jìn)行單元測(cè)試,便于調(diào)試程序和診可維護(hù)性比較好,非常便于進(jìn)行單元測(cè)試,便于調(diào)試程序和診斷故障。斷故障。2.很容易將一個(gè)大的任務(wù)劃分為細(xì)小的任務(wù),開發(fā)效率和產(chǎn)品質(zhì)很容易將一個(gè)大的任務(wù)劃分為細(xì)小的任務(wù),開發(fā)效率和產(chǎn)品質(zhì)量必將得到大幅度的提高。量必將得到大幅度的提高。3.可復(fù)用性好可復(fù)用性好4.更換一個(gè)實(shí)現(xiàn)子類將會(huì)變得很簡(jiǎn)單,只要修改配置文件就可更換一個(gè)實(shí)現(xiàn)
8、子類將會(huì)變得很簡(jiǎn)單,只要修改配置文件就可以了以了F H 2022/4/1215IOC容器的一些產(chǎn)品容器的一些產(chǎn)品重量級(jí)重量級(jí)IoC Container所謂重量級(jí)IoC Container,是指一般用外部配置文件(一般是XML)作為依賴源,并托管整個(gè)系統(tǒng)各個(gè)類的實(shí)例化的IoC Container。這種IoC Container,一般是承接了整個(gè)系統(tǒng)幾乎所有多態(tài)性的依賴注入工作,并承接了所有服務(wù)類的實(shí)例化工作. Spring和Spring.NET是重量級(jí)IoC Container的例子。輕量級(jí)輕量級(jí)IoC Container還有一種IoC Container,一般不依賴外部配置文件,而主要使用傳參
9、的Setter或Construtor注入,這種IoC Container叫做輕量級(jí)IoC Container。Unity是一個(gè)典型的輕量級(jí)IoC Container。2022/4/1216比較知名的IoC容器有:Pico Container、Avalon 、Spring、JBoss、HiveMind、EJB等。上面的幾個(gè)IoC容器中,輕量級(jí)的有Pico Container、Avalon、Spring、HiveMind等,超重量級(jí)的有EJB,而半輕半重的有容器有JBoss,Jdon等。2022/4/1217 Spring是一個(gè)開源框架。它是為了解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性而創(chuàng)建的。Spring框架由
10、七個(gè)定義明確的模塊組成2022/4/1218核心容器核心容器 這是Spring框架最基礎(chǔ)的部分,它提供了依賴注入(Dependency Injection)特征來(lái)實(shí)現(xiàn)容器對(duì)Bean的管理。這里最基本的概念是BeanFactory,它是任何Spring應(yīng)用的核心。BeanFactory是工廠模式的一個(gè)實(shí)現(xiàn),它使用IoC將應(yīng)用配置和依賴說(shuō)明從實(shí)際的應(yīng)用代碼中分離出來(lái)。bean就相當(dāng)于定義一個(gè)組件,這個(gè)組件是用于具體實(shí)現(xiàn)某個(gè)功能的。這里的所定義的bean就相當(dāng)于給了你一個(gè)簡(jiǎn)潔方便的方法來(lái)調(diào)用這個(gè)組件實(shí)現(xiàn)你要完成的功能。2022/4/1219.Net中實(shí)現(xiàn)控制翻轉(zhuǎn)和依賴注入的方法中實(shí)現(xiàn)控制翻轉(zhuǎn)和依賴注
11、入的方法1.通過(guò)微軟官方的Unity下載地址:http:/ 使用unity實(shí)現(xiàn)依賴注入2.使用框架下載地址:http:/ 使用實(shí)現(xiàn)依賴注入3.使用框架Autofac下載地址:http:/ 使用Autofac實(shí)現(xiàn)依賴注入當(dāng)然了,實(shí)現(xiàn)依賴注入還有其他框架,比如:Castle和Ninject等2022/4/12201:本實(shí)例將通過(guò)一個(gè)簡(jiǎn)單的三層演示使用Unity實(shí)現(xiàn)依賴注入,并把相應(yīng)的具體實(shí)例寫入在配置文件里,達(dá)到后期可能方便修改;首先看一下實(shí)例分層的情況:UnityIAopDAL-數(shù)據(jù)接口層數(shù)據(jù)接口層(類庫(kù)) AopDAL AopOracelDAL-分別實(shí)現(xiàn)數(shù)據(jù)接口的數(shù)據(jù)層(類庫(kù))IAopBLL-
12、邏輯接口層邏輯接口層(類庫(kù)) AopBLL-實(shí)現(xiàn)邏輯接口層(類庫(kù)) AopUnity-主程序?qū)又鞒绦驅(qū)覥ommand-公共助手層公共助手層(類庫(kù))2022/4/12212:其中Command我們簡(jiǎn)單編寫一個(gè)實(shí)現(xiàn)Unity助手的類;首先要引用幾個(gè)Unity的DLL文件;3:AopDAL、AopOracelDAL是兩個(gè)實(shí)現(xiàn)不同功能的類庫(kù),在這我們就比喻成一個(gè)插入MSSQL數(shù)據(jù)庫(kù),另外一個(gè)就是插入Oracel數(shù)據(jù)庫(kù);其中其中AopBLL我們沒有直接引用具體的我們沒有直接引用具體的AopDAL數(shù)據(jù)層,而是引用其對(duì)數(shù)據(jù)層,而是引用其對(duì)應(yīng)接口層;主程序應(yīng)接口層;主程序 AopUnity同樣也沒有具體的同樣
13、也沒有具體的BLL層,也是引用其層,也是引用其BLL接口層;接口層;把接口對(duì)應(yīng)的具體層類寫入到配置文件里,做到依賴注入,只要簡(jiǎn)單把接口對(duì)應(yīng)的具體層類寫入到配置文件里,做到依賴注入,只要簡(jiǎn)單修改配置文件就可以達(dá)到修改調(diào)用;修改配置文件就可以達(dá)到修改調(diào)用;因?yàn)锳opDAL、AopOracelDAL、AopBLL我們都沒有直接引用,所以在生成DLL后是不會(huì)保存在主程序的bin里面,所以我們要修改這三個(gè)生成的路徑;2022/4/12221:IAopDAL層我們只簡(jiǎn)單創(chuàng)建一個(gè)IReadData類代碼:using System; using System.Collections.Generic; usin
14、g System.Linq; using System.Text; namespace IAopDAL public interface IReadData string ReadDataStr(string Name); 2022/4/12232: AopDAL實(shí)現(xiàn)接口層IAopDALusing IAopDAL; namespace AopDAL public classReadDataDAL:IReadData public string ReadDataStr(string Name) return string.Format(把把0寫入寫入MSSQL數(shù)據(jù)庫(kù)成功數(shù)據(jù)庫(kù)成功, Name);
15、 2022/4/12243:AopOracelDAL同樣實(shí)現(xiàn)IAopDAL層,其功能跟AopDAL一樣using IAopDAL; namespace AopOracelDAL public class ReadDataDAL:IReadData public string ReadDataStr(string Name) return string.Format(把把0寫入寫入Oracel數(shù)據(jù)庫(kù)成數(shù)據(jù)庫(kù)成功功, Name); 2022/4/12254:IAopBLL邏輯接口層的內(nèi)容如下:namespace IAopBLL public interface IReadDataBLL strin
16、g ReadDataStr(string Name); 2022/4/12265:AopBLL層實(shí)現(xiàn)IAopBLL接口層,要引用IAopDAL、IAopBLL、Command;using IAopDAL; using IAopBLL;using Command; namespace AopBLL public class ReadDataBLL:IReadDataBLL IReadData bllServer = new UnityContainerHelp().GetServer();/ 通過(guò)公共助手Command類庫(kù)調(diào)用Unity來(lái)實(shí)現(xiàn)依賴注入,public string ReadData
17、Str(string Name) return bllServer.ReadDataStr(Name); 2022/4/12276:Command公類助手代碼,引用幾個(gè)Unity的命名空間,我們把依賴注入的對(duì)象寫入在主程序的.config文件里,這邊就是通過(guò)讀取配置通過(guò)讀取配置文件來(lái)查看其對(duì)應(yīng)哪個(gè)類庫(kù);文件來(lái)查看其對(duì)應(yīng)哪個(gè)類庫(kù);using System.Text;using Microsoft.Practices.Unity; using Microsoft.Practices.Unity.Configuration; using Microsoft.Practices.Unity.Inter
18、ceptionExtension;using Microsoft.Practices.Unity.InterceptionExtension.Configuration; using System.Configuration; namespace Command public class UnityContainerHelp private IUnityContainer container; public UnityContainerHelp() container = new UnityContainer(); UnityConfigurationSection section = (Un
19、ityConfigurationSection)ConfigurationManager.GetSection(unity); container.LoadConfiguration(section, FirstClass); public T GetServer() return container.Resolve(); public T GetServer(string Name) return container.Resolve(Name); 2022/4/12287:主程序代碼:同樣只是簡(jiǎn)單的引用Command、IAopBLL兩層;using Command; using IAopBL
20、L; namespace AopUnity class Program static void Main(string args) IReadDataBLL bllServer = new UnityContainerHelp().GetServer(); Console.WriteLine(bllServer.ReadDataStr(“好好學(xué)習(xí)好好學(xué)習(xí)); 2022/4/1229我們新建一個(gè)App.config文件;其中register 就是我們注入的節(jié)點(diǎn),type為接口層,mapTo則是我們對(duì)應(yīng)的具體實(shí)現(xiàn)層,這邊也是我們修改配置的地方; 2022/4/1230由于經(jīng)常會(huì)在編程時(shí)使用到DI,
21、所以出現(xiàn)了一些DI的輔助工具,如Unity和Ninject等。由于Ninject的輕量和使用簡(jiǎn)單,所以選擇用它來(lái)開發(fā)MVC(模型(model)視圖(view)控制器(controller)應(yīng)用程序。下面介紹Ninject,但在這之前,先來(lái)介紹一個(gè)安裝Ninject需要用到的插件-NuGet。2022/4/1231NuGet 是一種 Visual Studio 擴(kuò)展,它能夠簡(jiǎn)化在 Visual Studio 項(xiàng)目中添加、更新和刪除庫(kù)(部署為程序包)的操作。2022/4/1232使用使用Ninject的一般步驟的一般步驟在使用Ninject前先要?jiǎng)?chuàng)建創(chuàng)建一個(gè)Ninject內(nèi)核對(duì)象class Pro
22、gram static void Main(string args) /創(chuàng)建Ninject內(nèi)核實(shí)例 IKernel ninjectKernel = new StandardKernel(); 使用Ninject內(nèi)核對(duì)象一般可分為兩個(gè)步驟。第一步是把一個(gè)接口(IValueCalculator)綁定綁定到一個(gè)實(shí)現(xiàn)該接口的類(LinqValueCalculator)./綁定接口到實(shí)現(xiàn)了該接口的類 ninjectKernel.Bind().ToLinqValueCalculator(); . 第二步是用Ninject的Get方法去獲取IValueCalculator接口的實(shí)現(xiàn)。. / 獲得實(shí)現(xiàn)接口的對(duì)象實(shí)例 IValueCalculator calcImpl = ninjectKernel.Get(); / 創(chuàng)建ShoppingCart實(shí)例并注入依賴 ShoppingCart cart = new ShoppingCart(calcImpl); 2022/4/1233但看上去Ninject的使用好像使得編
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《牛排知識(shí)大全》課件
- 收到補(bǔ)遺書回復(fù)函
- 醫(yī)學(xué)生手足口病護(hù)理
- 2024年酒店游泳池租賃合同樣本3篇
- 幫我們系數(shù)學(xué)試卷
- 初一數(shù)學(xué)下冊(cè)數(shù)學(xué)試卷
- 平面向量與解三角形的歸納與復(fù)習(xí)
- 2025房屋裝修合同范本(版)
- 單元清五數(shù)學(xué)試卷
- 2024年版杭州離婚保險(xiǎn)權(quán)益分配協(xié)議書
- 開題報(bào)告:高質(zhì)量數(shù)字教材建設(shè)機(jī)制及政策研究
- PE工程師工作總結(jié)
- 以案促改心得體會(huì)
- 華東師范大學(xué)《法學(xué)導(dǎo)論(Ⅰ)》2023-2024學(xué)年第一學(xué)期期末試卷
- 空壓機(jī)操作安全培訓(xùn)
- 自然辯證法論述題146題帶答案(可打印版)
- 工程施工日志60篇
- 特殊作業(yè)安全管理監(jiān)護(hù)人專項(xiàng)培訓(xùn)課件
- 2024年中國(guó)工業(yè)級(jí)硝酸銨市場(chǎng)調(diào)查研究報(bào)告
- 成品油出入庫(kù)管理制度
- 電梯日管控、周排查、月調(diào)度內(nèi)容表格
評(píng)論
0/150
提交評(píng)論