亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

微軟企業(yè)庫(kù)4.1學(xué)習(xí)筆記(二十四)Unity依賴(lài)注入

系統(tǒng) 2025 0

  企業(yè)庫(kù)的依賴(lài)注入模塊Unity是一個(gè)輕量的、可擴(kuò)展的依賴(lài)注入容器,支持構(gòu)造函數(shù)注入、屬性注入、方法調(diào)用注入。你可以用它創(chuàng)建企業(yè)庫(kù)的對(duì)象,或者是自定義的對(duì)象。但是,Unity模塊和企業(yè)庫(kù)中的其他模塊有很多的不同點(diǎn):

  •   你可以在不安裝企業(yè)庫(kù)的情況下,直接使用Unity模塊的依賴(lài)注入功能。
  •   Unity模塊可以通過(guò)配置信息來(lái)準(zhǔn)備容器,也可以在運(yùn)行的時(shí)候在代碼中動(dòng)態(tài)創(chuàng)建依賴(lài)關(guān)系。
  •   Unity模塊不依賴(lài)于企業(yè)庫(kù)的核心庫(kù)和企業(yè)庫(kù)的配置系統(tǒng),它用自己內(nèi)置的方法讀取配置信息,如果需要的話,也可以從企業(yè)庫(kù)的配置文件中讀取Unity的配置信息。

  Unity模塊具有下面的優(yōu)點(diǎn):

  •   提供了簡(jiǎn)單的對(duì)象創(chuàng)建,尤其是對(duì)于有繼承關(guān)系的對(duì)象和有依賴(lài)關(guān)系的對(duì)象,提供了簡(jiǎn)單的代碼實(shí)現(xiàn)。
  •   支持抽象需求,允許開(kāi)發(fā)者在運(yùn)行的時(shí)候確定依賴(lài)關(guān)系,或者是在配置的時(shí)候指明依賴(lài)關(guān)系。
  •   增加了靈活性,通過(guò)在容器中延遲組件之間的配置。
  •   具有服務(wù)定位的能力,允許客戶端存儲(chǔ)和緩存容器。這在ASP.NET中相當(dāng)有用,開(kāi)發(fā)者可以將容器持久在ASP.NET的session或者是application中。

  下面將包括一些列的主題,你可以看看Unity是否適合你的應(yīng)用需求。

  •  常用的解決方案。
  •   示例代碼
  •   Unity的亮點(diǎn)
  •   什么時(shí)候使用Unity模塊

  一、常用的解決方案

  Unity模塊可以解決開(kāi)發(fā)者面對(duì)的以組件為基礎(chǔ)的開(kāi)發(fā)中遇到的一些問(wèn)題。現(xiàn)代的商業(yè)應(yīng)用中,有許多用來(lái)實(shí)現(xiàn)特殊功能的業(yè)務(wù)對(duì)象和組件,還有一些組件可以獨(dú)立實(shí)現(xiàn)一些功能,例如,日志、驗(yàn)證、授權(quán)、緩存和異常處理。

  成功建立這種類(lèi)型應(yīng)用的關(guān)鍵,就是完成一個(gè)解耦的、松散耦合的設(shè)計(jì)。松散耦合的應(yīng)用更靈活,并且更容易維護(hù)。同樣,在開(kāi)發(fā)的過(guò)程中,他們也很容易測(cè)試。你可以偽造那些有強(qiáng)依賴(lài)的對(duì)象,例如,數(shù)據(jù)庫(kù)連接、網(wǎng)絡(luò)連接、ERP連接和富客戶端接口組件,來(lái)進(jìn)行單元測(cè)試。

  依賴(lài)注入是建立松散耦合應(yīng)用的主要技術(shù)。它提供了一些處理對(duì)象之間依賴(lài)的方法。例如,一個(gè)處理客戶信息的對(duì)象,可能會(huì)依賴(lài)于訪問(wèn)存儲(chǔ)的對(duì)象,驗(yàn)證信息的對(duì)象,和檢查用戶是否具有更新權(quán)限的對(duì)象。依賴(lài)注入技術(shù)可以確保客戶類(lèi)被正確的初始化,加載上面用到的對(duì)象,特別在當(dāng)依賴(lài)是抽象的時(shí)候。

  下面的模式定義了處理這個(gè)過(guò)程的架構(gòu)和開(kāi)發(fā)方法:

  •   Inversion of Control(IOC)pattern。這種模式支持插件式的架構(gòu),使得對(duì)象可以查詢其他需要的對(duì)象。
  •   Dependency Injection(DI)pattern。是一種特殊的IOC模式,是一種以面向接口為基礎(chǔ)的編程技術(shù),可以修改類(lèi)的行為,但是不是通過(guò)修改類(lèi)的內(nèi)部實(shí)現(xiàn)。開(kāi)發(fā)者使用接口編程,用一個(gè)容器在類(lèi)中注入依賴(lài)的對(duì)象實(shí)例,注入對(duì)象實(shí)例的方法包括:接口注入,構(gòu)造函數(shù)注入屬性(setter)注入,方法調(diào)用注入。
  •   Interception pattern。這種模式引入另一種層次的間接性。在客戶端和真實(shí)對(duì)象之間放一個(gè)對(duì)象。在客戶端和真實(shí)對(duì)象之間有一個(gè)代理。客戶端的行為通過(guò)代理和真實(shí)對(duì)象進(jìn)行交互,以及其他需要交互的對(duì)象。

  下面將向大家演示下列功能:

  •   建立Unity容器
  •   獲取指定類(lèi)型的對(duì)象
  •   獲取指定類(lèi)型和注冊(cè)名的對(duì)象
  •   獲取一個(gè)特殊類(lèi)型的全部對(duì)象
  •   使用BuildUp創(chuàng)建對(duì)象,而不是通過(guò)容器
  •   為構(gòu)造函數(shù)注入注釋對(duì)象
  •   為屬性(setter)注入注釋對(duì)象
  •   為方法調(diào)用注入注釋對(duì)象

  另外,Unity的示例代碼中還包含其他的技術(shù),一個(gè)簡(jiǎn)單的MVP模式實(shí)現(xiàn),和一個(gè)Event Broker服務(wù)作為自定義的容器擴(kuò)展。

  示例代碼

  使用依賴(lài)注入框架和反轉(zhuǎn)控制技術(shù),開(kāi)發(fā)者可以生成自定義類(lèi)的實(shí)例,和依賴(lài)其他對(duì)象的對(duì)象實(shí)例。Unity模塊支持這些功能,開(kāi)發(fā)者可以使用容器配置注入、構(gòu)造函數(shù)注入、屬性注入、方法調(diào)用注入,創(chuàng)建所有有依賴(lài)的對(duì)象實(shí)例。

  Unity提供了兩個(gè)方法,可以在容器中注冊(cè)類(lèi)型和映射關(guān)系。

  •   RegisterType,這個(gè)方法在容器中注冊(cè)一個(gè)類(lèi)型,在適當(dāng)?shù)臅r(shí)候,容器會(huì)創(chuàng)建一個(gè)指定類(lèi)型的實(shí)例。可以通過(guò)類(lèi)的attribute或者是調(diào)用Resolve方法來(lái)實(shí)現(xiàn)。創(chuàng)建的對(duì)象的生命周期,就是在參數(shù)中指定的生命周期。如果你沒(méi)有提供生命周期參數(shù),注冊(cè)類(lèi)型的生命周期是短暫的,意味著每次調(diào)用Resolve方法的時(shí)候,容器都會(huì)創(chuàng)建一個(gè)新的對(duì)象實(shí)例。

?

?

代碼
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> using ?System;
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,這個(gè)方法在容器中注冊(cè)一個(gè)已經(jīng)存在實(shí)例的類(lèi)型,生命周期可以指定。在生命周期里面,容器返回這個(gè)已經(jīng)存在的實(shí)例。如果沒(méi)有指定生命周期,實(shí)例的生命周期由容器控制。

?

?

代碼
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> using ?System;
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ù)注入

  如果開(kāi)發(fā)者使用Unity的Resolve方法初始化的一個(gè)類(lèi)有一個(gè)構(gòu)造函數(shù),構(gòu)造函數(shù)有一個(gè)以上的參數(shù),參數(shù)的類(lèi)型是其他的自定義類(lèi),Unity容器會(huì)自動(dòng)創(chuàng)建參數(shù)中描述的依賴(lài)對(duì)象。例如下面的CustomService類(lèi),依賴(lài)于一個(gè)LoggingService類(lèi)。

?

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> ? public ? class ?CustomService:IMyService?
????{
????????
public ?CustomService?(LoggingService?logger)
????????{
????????????logger?.WriteToLog(
" Some?Value " );
????????}
????}

?

  在運(yùn)行的時(shí)候,開(kāi)發(fā)者使用容器的Resolve方法創(chuàng)建一個(gè)CustomService的實(shí)例,容器也會(huì)在CustomService類(lèi)型范圍內(nèi)創(chuàng)建一個(gè)LoggingService對(duì)象實(shí)例。

?

?

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> IUnityContainer?myContainer = new ?UnityContainer?();
????????????CustomService?myInstance
= myContainer?.Resolve? < CustomService?? > ();

?

?

  屬性注入

  除了構(gòu)造函數(shù)注入,Unity還支持屬性注入和方法調(diào)用注入。下面將講述屬性注入。一個(gè)ProductService類(lèi)有一個(gè)屬性,是一個(gè)叫做SupplierData的類(lèi),通過(guò)在屬性上添加Denpendency特性實(shí)現(xiàn)屬性注入。

?

代碼
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> public ? class ?SupplierData
????{
????}
????
public ? class ?ProductData
????{
????????
private ?SupplierData?_supplier;
????????
????????[Dependency?]
????????
public ?SupplierData?Supplier
????????{
????????????
get { return ?_supplier?;}
????????????
set { this ._supplier = var;}
????????}
????}
????

?

?

  現(xiàn)在,使用Unity創(chuàng)建一個(gè)ProductData對(duì)象實(shí)例,會(huì)自動(dòng)創(chuàng)建一個(gè)SupplierData類(lèi)的實(shí)例作為ProductData對(duì)象的屬性值。

   未完待續(xù)。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

微軟企業(yè)庫(kù)4.1學(xué)習(xí)筆記(二十四)Unity依賴(lài)注入模塊 簡(jiǎn)介


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 天天干夜夜操视频 | 97国产精品国产品国语字幕 | 日本不卡高清 | 色四虎| 国产爱v| 全黄一级裸片视频在线观看 | 高清二区 | 在线a网站 | 国产成人毛片视频不卡在线 | 激情影院免费看 | 在线中文字幕亚洲 | 国产精品久久久久久免费播放 | 四虎影视8848a四虎在线播放 | 老色鬼久久综合第一 | 中文在线观看视频 | 亚洲欧美强伦一区二区另类 | 亚洲国产韩国一区二区 | 伊人网综合在线视频 | 久久99这里精品8国产 | 国内精品久久久久久麻豆 | 香蕉视频一区二区三区 | 久久国产精品久久精品国产 | 99精品国产自在现线观看 | 国产小视频免费在线观看 | 天天干天天射天天插 | 玖玖爱免费 | 午夜网站在线观看免费网址免费 | 国产理论最新国产精品视频 | 欧美精品99久久久久久人 | 免费国产一区二区三区四区 | 私人影院在线免费观看 | 欧美又粗又硬 | 亚洲欧美国产五月天综合 | 天天久久狠狠色综合 | 91尤物国产尤物福利 | 精品视频在线免费看 | 久久久久久久国产免费看 | 久久精品国产精品2020 | 深夜福利免费观看 | 欧美综合一区 | 男人天堂黄色 |