版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
2023/2/61依賴注入分享人:王蕊2DI——DependencyInjection
依賴注入:
IoC——InversionofControl控制反轉(zhuǎn):
兩個(gè)名詞:3我們都知道,在采用面向?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)系與之非常相似。對(duì)象之間耦合度過(guò)高的系統(tǒng),必然會(huì)出現(xiàn)牽一發(fā)而動(dòng)全身的情形。2023/2/64如何降低系統(tǒng)之間、模塊之間和對(duì)象之間的耦合度,是軟件工程永遠(yuǎn)追求的目標(biāo)之一。軟件專家MichaelMattson提出了IOC理論IOC理論提出的觀點(diǎn)大體是這樣的:借助于“第三方”實(shí)現(xiàn)具有依賴關(guān)系的對(duì)象之間的解耦.。2023/2/65IOC解耦過(guò)程分析:齒輪之間的傳動(dòng)全部依靠“第三方”了,全部對(duì)象的控制權(quán)全部上繳給“第三方”IOC容器,所以,IOC容器成了整個(gè)系統(tǒng)的關(guān)鍵核心,它起到了一種類似“粘合劑”的作用,把系統(tǒng)中的所有對(duì)象粘合在一起發(fā)揮作用。2023/2/66拿掉IoC容器后的系統(tǒng)A、B、C、D這4個(gè)對(duì)象之間已經(jīng)沒(méi)有了耦合關(guān)系,彼此毫無(wú)聯(lián)系,當(dāng)實(shí)現(xiàn)A的時(shí)候,根本無(wú)須再去考慮B、C和D了,對(duì)象之間的依賴關(guān)系已經(jīng)降低到了最低程度。2023/2/67常規(guī)A使用C示意圖A類不再主動(dòng)創(chuàng)建C2023/2/68控制反轉(zhuǎn)(IOC)為什么要起這么個(gè)名字?通過(guò)前后的對(duì)比,我們不難看出來(lái):對(duì)象A獲得依賴對(duì)象B的過(guò)程,由主動(dòng)行為變?yōu)榱吮粍?dòng)行為,控制權(quán)顛倒過(guò)來(lái)了,這就是“控制反轉(zhuǎn)”這個(gè)名稱的由來(lái)。2023/2/69IOC的別名:依賴注入(DI)2004年,MartinFowler探討了同一個(gè)問(wèn)題,既然IOC是控制反轉(zhuǎn),那么到底是“哪些方面的控制被反轉(zhuǎn)了呢?”最后,他得出了答案:“獲得依賴對(duì)象的過(guò)程被反轉(zhuǎn)了”??刂票环崔D(zhuǎn)之后,獲得依賴對(duì)象的過(guò)程由自身管理變?yōu)榱擞蒊OC容器主動(dòng)注入。于是,他給“控制反轉(zhuǎn)”取了一個(gè)更合適的名字叫做“依賴注入”2023/2/610所以,依賴注入(DI)和控制反轉(zhuǎn)(IOC)是從不同的角度的描述的同一件事情,就是指通過(guò)引入IOC容器,利用依賴關(guān)系注入的方式,實(shí)現(xiàn)對(duì)象之間的解耦。2023/2/611依賴注入的方法:Setter注入Setter注入(SetterInjection)是指在客戶類中,設(shè)置一個(gè)服務(wù)類接口類型的數(shù)據(jù)成員,并設(shè)置一個(gè)Set方法作為注入點(diǎn),這個(gè)Set方法接受一個(gè)具體的服務(wù)類實(shí)例為參數(shù),并將它賦給服務(wù)類接口類型的數(shù)據(jù)成員。2023/2/612構(gòu)造注入構(gòu)造注入(ConstructorInjection)是指在客戶類中,設(shè)置一個(gè)服務(wù)類接口類型的數(shù)據(jù)成員,并以構(gòu)造函數(shù)為注入點(diǎn),這個(gè)實(shí)例為參數(shù),并將它賦給服務(wù)類接口類構(gòu)造函數(shù)接受一個(gè)具體的服務(wù)類型的數(shù)據(jù)成員。2023/2/613統(tǒng)一建模語(yǔ)言(UML)是建模語(yǔ)言,其核心就是把軟件的設(shè)計(jì)思想通過(guò)建模的方法表達(dá)出來(lái)。故非常適合于表達(dá)設(shè)計(jì)模式。同時(shí)UML已經(jīng)被廣泛用于軟件設(shè)計(jì),這也推動(dòng)了設(shè)計(jì)模式的應(yīng)用。2023/2/614IOC/DI為我們帶來(lái)了什么好處?1.可維護(hù)性比較好,非常便于進(jìn)行單元測(cè)試,便于調(diào)試程序和診斷故障。2.很容易將一個(gè)大的任務(wù)劃分為細(xì)小的任務(wù),開發(fā)效率和產(chǎn)品質(zhì)量必將得到大幅度的提高。3.可復(fù)用性好4.更換一個(gè)實(shí)現(xiàn)子類將會(huì)變得很簡(jiǎn)單,只要修改配置文件就可以了FH2023/2/615IOC容器的一些產(chǎn)品重量級(jí)IoCContainer所謂重量級(jí)IoCContainer,是指一般用外部配置文件(一般是XML)作為依賴源,并托管整個(gè)系統(tǒng)各個(gè)類的實(shí)例化的IoCContainer。這種IoCContainer,一般是承接了整個(gè)系統(tǒng)幾乎所有多態(tài)性的依賴注入工作,并承接了所有服務(wù)類的實(shí)例化工作.Spring和Spring.NET是重量級(jí)IoCContainer的例子。輕量級(jí)IoCContainer還有一種IoCContainer,一般不依賴外部配置文件,而主要使用傳參的Setter或Construtor注入,這種IoCContainer叫做輕量級(jí)IoCContainer。Unity是一個(gè)典型的輕量級(jí)IoCContainer。2023/2/616比較知名的IoC容器有:PicoContainer、Avalon、Spring、JBoss、HiveMind、EJB等。上面的幾個(gè)IoC容器中,輕量級(jí)的有PicoContainer、Avalon、Spring、HiveMind等,超重量級(jí)的有EJB,而半輕半重的有容器有JBoss,Jdon等。2023/2/617Spring是一個(gè)開源框架。它是為了解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性而創(chuàng)建的。Spring框架由七個(gè)定義明確的模塊組成2023/2/618核心容器這是Spring框架最基礎(chǔ)的部分,它提供了依賴注入(DependencyInjection)特征來(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)你要完成的功能。
2023/2/619.Net中實(shí)現(xiàn)控制翻轉(zhuǎn)和依賴注入的方法
1.通過(guò)微軟官方的Unity
下載地址:/releases
使用介紹:.NET使用unity實(shí)現(xiàn)依賴注入
2.使用框架
下載地址:/download.html
使用介紹:.NET使用實(shí)現(xiàn)依賴注入
3.使用框架Autofac
下載地址:/p/autofac/downloads/list
使用介紹:.NET使用Autofac實(shí)現(xiàn)依賴注入
當(dāng)然了,實(shí)現(xiàn)依賴注入還有其他框架,比如:Castle和Ninject等2023/2/6201:本實(shí)例將通過(guò)一個(gè)簡(jiǎn)單的三層演示使用Unity實(shí)現(xiàn)依賴注入,并把相應(yīng)的具體實(shí)例寫入在配置文件里,達(dá)到后期可能方便修改;首先看一下實(shí)例分層的情況:UnityIAopDAL-數(shù)據(jù)接口層(類庫(kù))[AopDALAopOracelDAL]-分別實(shí)現(xiàn)數(shù)據(jù)接口的數(shù)據(jù)層(類庫(kù))IAopBLL-邏輯接口層(類庫(kù))AopBLL-實(shí)現(xiàn)邏輯接口層(類庫(kù))
AopUnity-主程序?qū)覥ommand-公共助手層(類庫(kù))2023/2/6212:其中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我們沒(méi)有直接引用具體的AopDAL數(shù)據(jù)層,而是引用其對(duì)應(yīng)接口層;主程序AopUnity同樣也沒(méi)有具體的BLL層,也是引用其BLL接口層;把接口對(duì)應(yīng)的具體層類寫入到配置文件里,做到依賴注入,只要簡(jiǎn)單修改配置文件就可以達(dá)到修改調(diào)用;因?yàn)锳opDAL、AopOracelDAL、AopBLL我們都沒(méi)有直接引用,所以在生成DLL后是不會(huì)保存在主程序的bin里面,所以我們要修改這三個(gè)生成的路徑;2023/2/6221:IAopDAL層我們只簡(jiǎn)單創(chuàng)建一個(gè)IReadData類代碼:usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceIAopDAL{public
interfaceIReadData{stringReadDataStr(stringName);}}
2023/2/6232:AopDAL實(shí)現(xiàn)接口層IAopDALusingIAopDAL;
namespaceAopDAL{public
classReadDataDAL:IReadData{public
stringReadDataStr(stringName){return
string.Format("把{0}寫入MSSQL數(shù)據(jù)庫(kù)成功",Name);}}}
2023/2/6243:AopOracelDAL同樣實(shí)現(xiàn)IAopDAL層,其功能跟AopDAL一樣usingIAopDAL;namespaceAopOracelDAL{public
classReadDataDAL:IReadData{public
stringReadDataStr(stringName){return
string.Format("把{0}寫入Oracel數(shù)據(jù)庫(kù)成功",Name);}}}
2023/2/6254:IAopBLL邏輯接口層的內(nèi)容如下:namespaceIAopBLL{
public
interfaceIReadDataBLL{stringReadDataStr(stringName);}}
2023/2/6265:AopBLL層實(shí)現(xiàn)IAopBLL接口層,要引用IAopDAL、IAopBLL、Command;usingIAopDAL;usingIAopBLL;usingCommand;namespaceAopBLL{public
classReadDataBLL:IReadDataBLL{IReadDatabllServer=newUnityContainerHelp().GetServer<IReadData>();//通過(guò)公共助手Command類庫(kù)調(diào)用Unity來(lái)實(shí)現(xiàn)依賴注入,public
stringReadDataStr(stringName){returnbllServer.ReadDataStr(Name);}}}
2023/2/6276:Command公類助手代碼,引用幾個(gè)Unity的命名空間,我們把依賴注入的對(duì)象寫入在主程序的.config文件里,這邊就是通過(guò)讀取配置文件來(lái)查看其對(duì)應(yīng)哪個(gè)類庫(kù);usingSystem.Text;usingMicrosoft.Practices.Unity;usingMicrosoft.Practices.Unity.Configuration;usingMicrosoft.Practices.Unity.InterceptionExtension;usingMicrosoft.Practices.Unity.InterceptionExtension.Configuration;usingSystem.Configuration;
namespaceCommand{public
classUnityContainerHelp{privateIUnityContainercontainer;
publicUnityContainerHelp(){container=newUnityContainer();UnityConfigurationSectionsection=(UnityConfigurationSection)ConfigurationManager.GetSection("unity");container.LoadConfiguration(section,"FirstClass");}publicTGetServer<T>(){returncontainer.Resolve<T>();}
publicTGetServer<T>(stringName){returncontainer.Resolve<T>(Name);}}}
2023/2/6287:主程序代碼:同樣只是簡(jiǎn)單的引用Command、IAopBLL兩層;usingCommand;usingIAopBLL;namespaceAopUnity{classProgram{static
voidMain(string[]args){IReadDataBLLbllServer=newUnityContainerHelp().GetServer<IReadDataBLL>();Console.WriteLine(bllServer.ReadDataStr(“好好學(xué)習(xí)"));}}}
2023/2/629我們新建一個(gè)App.config文件;其中register就是我們注入的節(jié)點(diǎn),type為接口層,mapTo則是我們對(duì)應(yīng)的具體實(shí)現(xiàn)層,這邊也是我們修改配置的地方;<configuration><configSections><sectionname="unity"type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/></configSections><unityxmlns="/practces/2010/unity"><containername="FirstClass"><registertype="IAopBLL.IReadDataBLL,IAopBLL"mapTo="AopBLL.ReadDataBLL,AopBLL"></register><registertype="IAopDAL.IReadData,IAopDAL"mapTo="AopOracelDAL.ReadDataDAL,AopOracelDAL"/></container></unity><startup><supportedRuntimeversion="v4.0"sku=".NETFramework,Version=v4.0"/></startup></configuration>
2023/2/630由于經(jīng)常會(huì)在編程時(shí)使用到DI,所以出現(xiàn)了一些DI的輔助工具,如Unity和Ninject等。由于Ninject的輕量和使用簡(jiǎn)單,所以選擇用它來(lái)開發(fā)MVC(模型(model)-視圖(view)-控制器(controller))應(yīng)用程序。下面介紹Ninject,但在這之前,先來(lái)介紹一個(gè)安裝Ninject需要用到的插件-NuGet。2023/2/631NuGet
是一種VisualStudio擴(kuò)展,它能夠簡(jiǎn)化在VisualStudio項(xiàng)目中添加、更新和刪除庫(kù)(部署為程序包)的操作。2023/2/632使用Ninject的一般步驟在使用Ninject前先要?jiǎng)?chuàng)建一個(gè)Ninject內(nèi)核對(duì)象classProgram{staticvoidMain(string[]args){//創(chuàng)建Ninject內(nèi)核實(shí)例IKernelninjectKernel=newStandardKernel();}}使用Ninject內(nèi)核對(duì)象一般可分為兩個(gè)步驟。第一步是把一個(gè)接口(IValueCalculator)綁定到一個(gè)實(shí)現(xiàn)該接口的類(LinqValueCalculator)...
//綁定接口到實(shí)現(xiàn)了該接口的類ninjectKernel.Bind<IValueCalculator>().To<LinqValueCalcu
溫馨提示
- 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 團(tuán)隊(duì)管理企業(yè)培訓(xùn)
- 二零二五年度企業(yè)兼職市場(chǎng)營(yíng)銷人員合同2篇
- 在線健康信息替代搜尋對(duì)老年人健康素養(yǎng)的影響研究-基于社會(huì)認(rèn)知理論
- 醫(yī)生年終工作總結(jié)
- 2025年度綠色建筑合作框架協(xié)議范本3篇
- 基于前景理論的大規(guī)模傳染疫情應(yīng)急管理決策研究
- 二零二五年P(guān)OS機(jī)租賃與移動(dòng)支付安全監(jiān)控合同3篇
- 臨床胃腸鏡術(shù)前術(shù)后護(hù)理要點(diǎn)
- Unit 4 Lesson 1My family photo(說(shuō)課稿)-2024-2025學(xué)年冀教版(2024)初中英語(yǔ)七年級(jí)上冊(cè)
- 全國(guó)冀教版信息技術(shù)三年級(jí)上冊(cè)新授課 二 畫大熊貓 說(shuō)課稿
- DB44∕T 2149-2018 森林資源規(guī)劃設(shè)計(jì)調(diào)查技術(shù)規(guī)程
- 肝移植的歷史、現(xiàn)狀與展望
- 商業(yè)定價(jià)表(含各商鋪價(jià)格測(cè)算銷售回款)
- 【化學(xué)】重慶市2021-2022學(xué)年高一上學(xué)期期末聯(lián)合檢測(cè)試題
- 供應(yīng)商物料質(zhì)量問(wèn)題賠償協(xié)議(終端)
- 單位工程質(zhì)量控制程序流程圖
- 部編版小學(xué)語(yǔ)文三年級(jí)(下冊(cè))學(xué)期課程綱要
- 化學(xué)工業(yè)有毒有害作業(yè)工種范圍表
- 洼田飲水試驗(yàn)
- 定置定位管理一
- 商票保貼協(xié)議
評(píng)論
0/150
提交評(píng)論