企業(yè)庫的依賴注入模塊Unity是一個輕量的、可擴(kuò)展的依賴注入容器,支持構(gòu)造函數(shù)注入、屬性注入、方法調(diào)用注入。你可以用它創(chuàng)建企業(yè)庫的對象,或者是自定義的對象。但是,Unity模塊和企業(yè)庫中的其他模塊有很多的不同點(diǎn):
- 你可以在不安裝企業(yè)庫的情況下,直接使用Unity模塊的依賴注入功能。
- Unity模塊可以通過配置信息來準(zhǔn)備容器,也可以在運(yùn)行的時候在代碼中動態(tài)創(chuàng)建依賴關(guān)系。
- Unity模塊不依賴于企業(yè)庫的核心庫和企業(yè)庫的配置系統(tǒng),它用自己內(nèi)置的方法讀取配置信息,如果需要的話,也可以從企業(yè)庫的配置文件中讀取Unity的配置信息。
Unity模塊具有下面的優(yōu)點(diǎn):
- 提供了簡單的對象創(chuàng)建,尤其是對于有繼承關(guān)系的對象和有依賴關(guān)系的對象,提供了簡單的代碼實(shí)現(xiàn)。
- 支持抽象需求,允許開發(fā)者在運(yùn)行的時候確定依賴關(guān)系,或者是在配置的時候指明依賴關(guān)系。
- 增加了靈活性,通過在容器中延遲組件之間的配置。
- 具有服務(wù)定位的能力,允許客戶端存儲和緩存容器。這在ASP.NET中相當(dāng)有用,開發(fā)者可以將容器持久在ASP.NET的session或者是application中。
下面將包括一些列的主題,你可以看看Unity是否適合你的應(yīng)用需求。
- 常用的解決方案。
- 示例代碼
- Unity的亮點(diǎn)
- 什么時候使用Unity模塊
一、常用的解決方案
Unity模塊可以解決開發(fā)者面對的以組件為基礎(chǔ)的開發(fā)中遇到的一些問題。現(xiàn)代的商業(yè)應(yīng)用中,有許多用來實(shí)現(xiàn)特殊功能的業(yè)務(wù)對象和組件,還有一些組件可以獨(dú)立實(shí)現(xiàn)一些功能,例如,日志、驗(yàn)證、授權(quán)、緩存和異常處理。
成功建立這種類型應(yīng)用的關(guān)鍵,就是完成一個解耦的、松散耦合的設(shè)計。松散耦合的應(yīng)用更靈活,并且更容易維護(hù)。同樣,在開發(fā)的過程中,他們也很容易測試。你可以偽造那些有強(qiáng)依賴的對象,例如,數(shù)據(jù)庫連接、網(wǎng)絡(luò)連接、ERP連接和富客戶端接口組件,來進(jìn)行單元測試。
依賴注入是建立松散耦合應(yīng)用的主要技術(shù)。它提供了一些處理對象之間依賴的方法。例如,一個處理客戶信息的對象,可能會依賴于訪問存儲的對象,驗(yàn)證信息的對象,和檢查用戶是否具有更新權(quán)限的對象。依賴注入技術(shù)可以確保客戶類被正確的初始化,加載上面用到的對象,特別在當(dāng)依賴是抽象的時候。
下面的模式定義了處理這個過程的架構(gòu)和開發(fā)方法:
- Inversion of Control(IOC)pattern。這種模式支持插件式的架構(gòu),使得對象可以查詢其他需要的對象。
- Dependency Injection(DI)pattern。是一種特殊的IOC模式,是一種以面向接口為基礎(chǔ)的編程技術(shù),可以修改類的行為,但是不是通過修改類的內(nèi)部實(shí)現(xiàn)。開發(fā)者使用接口編程,用一個容器在類中注入依賴的對象實(shí)例,注入對象實(shí)例的方法包括:接口注入,構(gòu)造函數(shù)注入屬性(setter)注入,方法調(diào)用注入。
- Interception pattern。這種模式引入另一種層次的間接性。在客戶端和真實(shí)對象之間放一個對象。在客戶端和真實(shí)對象之間有一個代理。客戶端的行為通過代理和真實(shí)對象進(jìn)行交互,以及其他需要交互的對象。
下面將向大家演示下列功能:
- 建立Unity容器
- 獲取指定類型的對象
- 獲取指定類型和注冊名的對象
- 獲取一個特殊類型的全部對象
- 使用BuildUp創(chuàng)建對象,而不是通過容器
- 為構(gòu)造函數(shù)注入注釋對象
- 為屬性(setter)注入注釋對象
- 為方法調(diào)用注入注釋對象
另外,Unity的示例代碼中還包含其他的技術(shù),一個簡單的MVP模式實(shí)現(xiàn),和一個Event Broker服務(wù)作為自定義的容器擴(kuò)展。
示例代碼
使用依賴注入框架和反轉(zhuǎn)控制技術(shù),開發(fā)者可以生成自定義類的實(shí)例,和依賴其他對象的對象實(shí)例。Unity模塊支持這些功能,開發(fā)者可以使用容器配置注入、構(gòu)造函數(shù)注入、屬性注入、方法調(diào)用注入,創(chuàng)建所有有依賴的對象實(shí)例。
Unity提供了兩個方法,可以在容器中注冊類型和映射關(guān)系。
- RegisterType,這個方法在容器中注冊一個類型,在適當(dāng)?shù)臅r候,容器會創(chuàng)建一個指定類型的實(shí)例。可以通過類的attribute或者是調(diào)用Resolve方法來實(shí)現(xiàn)。創(chuàng)建的對象的生命周期,就是在參數(shù)中指定的生命周期。如果你沒有提供生命周期參數(shù),注冊類型的生命周期是短暫的,意味著每次調(diào)用Resolve方法的時候,容器都會創(chuàng)建一個新的對象實(shí)例。
?
?

using ?Microsoft.Practices?.EnterpriseLibrary.Logging;
using ?Microsoft.Practices.Unity;
namespace ?BeautyCode.ConApp
{
???? public ????? interface ?IMyService
????{}
???? public ? class ?CustomService:IMyService?
????{}
???? /// ? <summary>
???? /// ?Description?of?Class4.
???? /// ? </summary>
???? public ? class ?Class4
????{
???????? public ?Class4()
????????{
????????????IUnityContainer?myContainer = new ?UnityContainer?();
????????????myContainer.RegisterType? < IMyService,CustomService > ();
????????????IMyService?myServiceInstance = myContainer.Resolve? < IMyService? > ();
????????}
????}
}
?
?
- RegisterInstance,這個方法在容器中注冊一個已經(jīng)存在實(shí)例的類型,生命周期可以指定。在生命周期里面,容器返回這個已經(jīng)存在的實(shí)例。如果沒有指定生命周期,實(shí)例的生命周期由容器控制。
?
?

using ?Microsoft.Practices?.EnterpriseLibrary.Logging;
using ?Microsoft.Practices.Unity;
namespace ?BeautyCode.ConApp
{
???? public ????? interface ?IMyService
????{}
???? public ? class ?CustomService:IMyService?
????{}
???? /// ? <summary>
???? /// ?Description?of?Class4.
???? /// ? </summary>
???? public ? class ?Class4
????{
???????? public ?Class4()
????????{
????????????IUnityContainer?myContainer = new ?UnityContainer?();
????????????CustomService?customerServ = new ?CustomService?();
????????????myContainer?.RegisterInstance? < IMyService? > (customerServ?);
????????????
????????????IMyService?myServiceInstance = myContainer.Resolve? < IMyService? > ();
????????}
????}
}
?
?
構(gòu)造函數(shù)注入
如果開發(fā)者使用Unity的Resolve方法初始化的一個類有一個構(gòu)造函數(shù),構(gòu)造函數(shù)有一個以上的參數(shù),參數(shù)的類型是其他的自定義類,Unity容器會自動創(chuàng)建參數(shù)中描述的依賴對象。例如下面的CustomService類,依賴于一個LoggingService類。
?
????{
???????? public ?CustomService?(LoggingService?logger)
????????{
????????????logger?.WriteToLog( " Some?Value " );
????????}
????}
?
在運(yùn)行的時候,開發(fā)者使用容器的Resolve方法創(chuàng)建一個CustomService的實(shí)例,容器也會在CustomService類型范圍內(nèi)創(chuàng)建一個LoggingService對象實(shí)例。
?
?
????????????CustomService?myInstance = myContainer?.Resolve? < CustomService?? > ();
?
?
屬性注入
除了構(gòu)造函數(shù)注入,Unity還支持屬性注入和方法調(diào)用注入。下面將講述屬性注入。一個ProductService類有一個屬性,是一個叫做SupplierData的類,通過在屬性上添加Denpendency特性實(shí)現(xiàn)屬性注入。
?

????{
????}
???? public ? class ?ProductData
????{
???????? private ?SupplierData?_supplier;
????????
????????[Dependency?]
???????? public ?SupplierData?Supplier
????????{
???????????? get { return ?_supplier?;}
???????????? set { this ._supplier = var;}
????????}
????}
????
?
?
現(xiàn)在,使用Unity創(chuàng)建一個ProductData對象實(shí)例,會自動創(chuàng)建一個SupplierData類的實(shí)例作為ProductData對象的屬性值。
未完待續(xù)。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
