




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、2022/3/221分享人:王蕊分享人:王蕊2DIDependency Injection 依賴注入:依賴注入: IoCInversion of Control控制反轉:控制反轉:兩個名詞:兩個名詞:3我們都知道,在采用面向對象方法設計的軟件系統中面向對象方法設計的軟件系統中,它的底層實現都是由N個對象組成的,所有的對象通過彼此的合作,最終實現系統的業務邏輯。就像手表齒輪的嚙合,軟件系統中對象之間的耦合關系軟件系統中對象之間的耦合關系與之與之非常相似。對象之間耦合度過高的系統,必然會出現牽一發而動全身的情形。對象之間耦合度過高的系統,必然會出現牽一發而動全身的情形。2022/3/224如何降低
2、系統之間、模塊之間和對象之間的耦合度,是軟件工程永遠追如何降低系統之間、模塊之間和對象之間的耦合度,是軟件工程永遠追求的目標之一。求的目標之一。軟件專家軟件專家Michael Mattson提出了提出了IOC理論理論IOC理論提出的觀點大體是這樣的:借助于理論提出的觀點大體是這樣的:借助于“第三方第三方”實現具有依賴關實現具有依賴關系的對象之間的解耦系的對象之間的解耦.。2022/3/225IOC解耦過程解耦過程分析:分析:齒輪之間的傳動全部依靠“第三方”了,全部對象的控制權全部上繳給全部對象的控制權全部上繳給“第三第三方方”IOC容器,所以,容器,所以,IOC容器成了整容器成了整個系統的關鍵
3、核心,它起到了一種類個系統的關鍵核心,它起到了一種類似似“粘合劑粘合劑”的作用,把系統中的所有的作用,把系統中的所有對象粘合在一起發揮作用對象粘合在一起發揮作用。2022/3/226拿掉拿掉IoC容器后的系統容器后的系統A、B、C、D這4個對象之間已經沒有了耦合關系,彼此毫無聯系,當實現當實現A的時候,根本無須再去考慮的時候,根本無須再去考慮B、C和和D了,對象之間的依賴關系已經降低到了,對象之間的依賴關系已經降低到了最低程度。了最低程度。2022/3/227常規A使用C示意圖A類不再主動創建C2022/3/228控制反轉控制反轉(IOC) 為什么要起這么個名字?為什么要起這么個名字?通過前后
4、的對比,通過前后的對比,我們不難看出來:對象A獲得依賴對象B的過程,由主動行為變為了被動行為,控制權顛倒控制權顛倒過來了,這就是“控制反轉”這個名稱的由來。2022/3/229IOC的別名:依賴注入的別名:依賴注入(DI)2004年,Martin Fowler探討了同一個問題,既然IOC是控制反轉,那么到底是“哪些方面的控制被反轉了呢?”最后,他得出了答案:“獲得依賴對象的過程被反轉了獲得依賴對象的過程被反轉了”。控制被反轉之后,獲得依賴對象獲得依賴對象的過程由自身管理變為了由的過程由自身管理變為了由IOC容器主動注入。容器主動注入。于是,他給“控制反轉”取了一個更合適的名字叫做“依賴注入依賴
5、注入”2022/3/2210所以,依賴注入所以,依賴注入(DI)和控制反轉和控制反轉(IOC)是從不同的角度的是從不同的角度的描述的同描述的同一件事情一件事情,就是指通過引入,就是指通過引入IOC容器,利用依賴關系注入的方式,實容器,利用依賴關系注入的方式,實現對象之間的解耦。現對象之間的解耦。2022/3/2211依賴注入依賴注入的方法:的方法:Setter注入注入Setter注入(注入(Setter Injection)是)是指在客戶類中,設置一個服指在客戶類中,設置一個服務類接口類型的數據成員,并設置一個務類接口類型的數據成員,并設置一個Set方法作為注入點方法作為注入點,這個,這個Se
6、t方法接受一個具體的服務類實例為參數,并將它方法接受一個具體的服務類實例為參數,并將它賦給服務類接口類型的數據成員。賦給服務類接口類型的數據成員。2022/3/2212構造注入構造注入構造注入(構造注入(Constructor Injection)是指在客戶類中,是指在客戶類中,設置一個服務類接口類型的數據成員,并以構造函數設置一個服務類接口類型的數據成員,并以構造函數為注入點,為注入點,這個實例為參數,并將它賦給服務類接口這個實例為參數,并將它賦給服務類接口類構造函數接受一個具體的服務類型的數據成員。類構造函數接受一個具體的服務類型的數據成員。2022/3/2213統一建模語言(UML)是建
7、模語言,其核心就是把軟件的設計思想通過建模的方法表達出來。故非常適合于表達設計模式。同時UML已經被廣泛用于軟件設計,這也推動了設計模式的應用。2022/3/2214IOC/DI為我們帶來了什么好處為我們帶來了什么好處?1.可維護性比較好,非常便于進行單元測試,便于調試程序和診可維護性比較好,非常便于進行單元測試,便于調試程序和診斷故障。斷故障。2.很容易將一個大的任務劃分為細小的任務,開發效率和產品質很容易將一個大的任務劃分為細小的任務,開發效率和產品質量必將得到大幅度的提高。量必將得到大幅度的提高。3.可復用性好可復用性好4.更換一個實現子類將會變得很簡單,只要修改配置文件就可更換一個實現
8、子類將會變得很簡單,只要修改配置文件就可以了以了F H 2022/3/2215IOC容器的一些產品容器的一些產品重量級重量級IoC Container所謂重量級IoC Container,是指一般用外部配置文件(一般是XML)作為依賴源,并托管整個系統各個類的實例化的IoC Container。這種IoC Container,一般是承接了整個系統幾乎所有多態性的依賴注入工作,并承接了所有服務類的實例化工作. Spring和Spring.NET是重量級IoC Container的例子。輕量級輕量級IoC Container還有一種IoC Container,一般不依賴外部配置文件,而主要使用傳參
9、的Setter或Construtor注入,這種IoC Container叫做輕量級IoC Container。Unity是一個典型的輕量級IoC Container。2022/3/2216比較知名的IoC容器有:Pico Container、Avalon 、Spring、JBoss、HiveMind、EJB等。上面的幾個IoC容器中,輕量級的有Pico Container、Avalon、Spring、HiveMind等,超重量級的有EJB,而半輕半重的有容器有JBoss,Jdon等。2022/3/2217 Spring是一個開源框架。它是為了解決企業應用開發的復雜性而創建的。Spring框架由
10、七個定義明確的模塊組成2022/3/2218核心容器核心容器 這是Spring框架最基礎的部分,它提供了依賴注入(Dependency Injection)特征來實現容器對Bean的管理。這里最基本的概念是BeanFactory,它是任何Spring應用的核心。BeanFactory是工廠模式的一個實現,它使用IoC將應用配置和依賴說明從實際的應用代碼中分離出來。bean就相當于定義一個組件,這個組件是用于具體實現某個功能的。這里的所定義的bean就相當于給了你一個簡潔方便的方法來調用這個組件實現你要完成的功能。2022/3/2219.Net中實現控制翻轉和依賴注入的方法中實現控制翻轉和依賴注
11、入的方法1.通過微軟官方的Unity下載地址:http:/ 使用unity實現依賴注入2.使用框架下載地址:http:/ 使用實現依賴注入3.使用框架Autofac下載地址:http:/ 使用Autofac實現依賴注入當然了,實現依賴注入還有其他框架,比如:Castle和Ninject等2022/3/22201:本實例將通過一個簡單的三層演示使用Unity實現依賴注入,并把相應的具體實例寫入在配置文件里,達到后期可能方便修改;首先看一下實例分層的情況:UnityIAopDAL-數據接口層數據接口層(類庫) AopDAL AopOracelDAL-分別實現數據接口的數據層(類庫)IAopBLL-
12、邏輯接口層邏輯接口層(類庫) AopBLL-實現邏輯接口層(類庫) AopUnity-主程序層主程序層Command-公共助手層公共助手層(類庫)2022/3/22212:其中Command我們簡單編寫一個實現Unity助手的類;首先要引用幾個Unity的DLL文件;3:AopDAL、AopOracelDAL是兩個實現不同功能的類庫,在這我們就比喻成一個插入MSSQL數據庫,另外一個就是插入Oracel數據庫;其中其中AopBLL我們沒有直接引用具體的我們沒有直接引用具體的AopDAL數據層,而是引用其對數據層,而是引用其對應接口層;主程序應接口層;主程序 AopUnity同樣也沒有具體的同樣
13、也沒有具體的BLL層,也是引用其層,也是引用其BLL接口層;接口層;把接口對應的具體層類寫入到配置文件里,做到依賴注入,只要簡單把接口對應的具體層類寫入到配置文件里,做到依賴注入,只要簡單修改配置文件就可以達到修改調用;修改配置文件就可以達到修改調用;因為AopDAL、AopOracelDAL、AopBLL我們都沒有直接引用,所以在生成DLL后是不會保存在主程序的bin里面,所以我們要修改這三個生成的路徑;2022/3/22221:IAopDAL層我們只簡單創建一個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/3/22232: AopDAL實現接口層IAopDALusing IAopDAL; namespace AopDAL public classReadDataDAL:IReadData public string ReadDataStr(string Name) return string.Format(把把0寫入寫入MSSQL數據庫成功數據庫成功, Name);
15、 2022/3/22243:AopOracelDAL同樣實現IAopDAL層,其功能跟AopDAL一樣using IAopDAL; namespace AopOracelDAL public class ReadDataDAL:IReadData public string ReadDataStr(string Name) return string.Format(把把0寫入寫入Oracel數據庫成數據庫成功功, Name); 2022/3/22254:IAopBLL邏輯接口層的內容如下:namespace IAopBLL public interface IReadDataBLL strin
16、g ReadDataStr(string Name); 2022/3/22265: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 ReadData
17、Str(string Name) return bllServer.ReadDataStr(Name); 2022/3/22276:Command公類助手代碼,引用幾個Unity的命名空間,我們把依賴注入的對象寫入在主程序的.config文件里,這邊就是通過讀取配置通過讀取配置文件來查看其對應哪個類庫;文件來查看其對應哪個類庫;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/3/22287:主程序代碼:同樣只是簡單的引用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(“好好學習好好學習); 2022/3/2229我們新建一個App.config文件;其中register 就是我們注入的節點,type為接口層,mapTo則是我們對應的具體實現層,這邊也是我們修改配置的地方; 2022/3/2230由于經常會在編程時使用到DI,
21、所以出現了一些DI的輔助工具,如Unity和Ninject等。由于Ninject的輕量和使用簡單,所以選擇用它來開發MVC(模型(model)視圖(view)控制器(controller)應用程序。下面介紹Ninject,但在這之前,先來介紹一個安裝Ninject需要用到的插件-NuGet。2022/3/2231NuGet 是一種 Visual Studio 擴展,它能夠簡化在 Visual Studio 項目中添加、更新和刪除庫(部署為程序包)的操作。2022/3/2232使用使用Ninject的一般步驟的一般步驟在使用Ninject前先要創建創建一個Ninject內核對象class Pro
22、gram static void Main(string args) /創建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/2233但看上去Ninject的使用好像使得編
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 健康人際關系與溝通技巧評估測試題及答案
- 2025年甘肅省隴南事業單位招聘啥時候發布筆試參考題庫及參考答案詳解1套
- 物資藥品器械管理制度
- 物資驗收倉儲管理制度
- 特殊場所飯店管理制度
- 特殊病人住院管理制度
- 特種作業人員管理制度
- 特種美發設備管理制度
- 特種門窗車間管理制度
- 特藥銷售團隊管理制度
- 真空系統設計課件
- 廉政風險防控臺賬
- 一年級看圖說話課件
- 公司崗位價值評估報告
- GB 39496-2020 尾礦庫安全規程
- 中國華電集團公司火電廠煙氣脫硫工程(石灰石-石膏濕法)設計導則(A版)
- 譯林版五下英語作文范文系列一
- 《小學英語小組合作學習的研究》課題結題報告
- 事業單位專業技術崗位說明書(小學)
- 試驗設計與數據處理作業333333
- 樹脂膠水物質資料安全表(MSDS)
評論
0/150
提交評論