一、Provider
在.NET frameword中每一個provider都是一段代碼的中間人,通過它,你的應(yīng)用可以連接到一個服務(wù)或者是數(shù)據(jù)源,可以獲取或者是修改服務(wù)和數(shù)據(jù)源的數(shù)據(jù)。在企業(yè)庫中包含很多的providers。另外,你也可以創(chuàng)建自己的provider,在你的應(yīng)用中滿足特殊的需求。
一個provider type定義了和一個模塊相關(guān)的功能的接口,一個provider是一個provider type的實(shí)現(xiàn)。每一個模塊中,對于一個provider type,都實(shí)現(xiàn)了很多的provider。也可以為模塊添加自定義的provider。
通過特殊的實(shí)現(xiàn)來分離模塊的功能,可以達(dá)到下面的目標(biāo):
- 變化性,這樣可以根據(jù)應(yīng)用的需求,解耦相同功能的多個實(shí)現(xiàn)。
- 擴(kuò)展性,允許你在某些強(qiáng)制實(shí)現(xiàn)的情況下使用模塊。例如,應(yīng)用在特殊的環(huán)境中,要求滿足一種特殊的加密算法。
- 封裝性,使用provider,功能不再是模塊的一部分,可以被代替和升級,而不對模塊的其他部分有影響。
- 跨環(huán)境的輕便型,你可以在新環(huán)境中部署模塊,使用為這個環(huán)境編寫的provider。你也可以編寫一個provider,運(yùn)行在一個環(huán)境中,卻模擬另外一個環(huán)境。
- 使得模塊之間的聯(lián)系最小化,如果一個模塊依賴于另一個模塊,可以將這種依賴封裝在provider中,一個模塊更新之后,如果使用provider,它依賴的模塊不用更新。例如,異常處理模塊,依賴于日志模塊來記錄異常信息。一個新版本的日志模塊需要一個新的日志provider,但是異常處理模塊可以不用更新。
二、設(shè)計時配置
所有的模塊對于配置節(jié)中都包括運(yùn)行時支持和設(shè)計時支持。運(yùn)行時支持包括配置中的類,在模塊加載的時候使用配置中的類。從配置中讀取信息,給模塊返回包含在配置中的對象。
設(shè)計時支持包含一些類,這些類使你可以用配置工具改變配置信息。
下面的圖中可以看出運(yùn)行時支持和設(shè)計時支持的關(guān)系
?
簡單的來所運(yùn)行時支持的類,使得你可以在運(yùn)行的時候利用配置節(jié)中的信息動態(tài)創(chuàng)建對象或者是其他的功能;設(shè)計時支持的類,使得你可以在設(shè)計的時候使用可視化的界面來設(shè)置配置節(jié)中的信息,不用手寫xml配置節(jié)了。
設(shè)計時的類依賴于運(yùn)行時的類,因?yàn)橥ㄟ^工具修改配置之后,需要保存,這時候就需要調(diào)用運(yùn)行時的類將配置保存起來。運(yùn)行時的類不依賴于設(shè)計時的類。每一個模塊的設(shè)計時支持用的類都是單獨(dú)的程序集。例如,Microsoft.Practices.EnterpriseLibrary.Security.Cache.Configuration.Design.dll,都是包含.Design的。這些程序集在你的應(yīng)用運(yùn)行的時候不需要他們,但是在你使用配置工具的時候就需要他們了。
三、儀表盤
在企業(yè)庫中,激發(fā)事件的代碼,和激發(fā)事件之后指定應(yīng)該發(fā)生那些行為的代碼是分開的。激發(fā)事件的代碼和provider有關(guān)系,對事件作出響應(yīng)的代碼則和listener代碼有關(guān)。這種分離允許你在事件發(fā)生的時候改變行為,而不用重新編譯provider代碼。但是,重新編譯listener還是需要的。
在你感興趣的東西發(fā)生的時候會激活一些事件,例如連接數(shù)據(jù)庫,記錄日志。激活事件會在代碼運(yùn)行的時候利用反射調(diào)用相關(guān)的listener。listener決定了在發(fā)生事件的時候,會有那些行為,例如,寫日志的時候,可以記錄寫日志事件,或者是增加計數(shù)器。沒有l(wèi)istener的模塊也可以正常運(yùn)行。
3.1使用特性Attribute
你可以用下面的特性,來給應(yīng)用添加listener和instrument
- InstrumentationListener
- InstrumentationProvider
- InstrumentationConsumer
InstrumentationListener特性出現(xiàn)在provider類的上面,告訴它初始化了那一個listener。InstrumentationProvider特性用在provider類的事件上面。InstrumentationConsumer特性用在listener類的事件處理方法上面,標(biāo)識的名稱必須和InstrumentationProvider標(biāo)識的名稱相同。
下面是一段示例代碼
?

????{
???????? public ?MyListener?( string ?instanceName, bool ?a, bool ?b, bool ?c){}
????????[InstrumentationConsumerAttribute?( " DbConnect " )]
???????? public ? void ?ConnectObserved( object ?sender,EventArgs?e)
????????{
????????????Console?.WriteLine?( " I?saw?a?database?connect. " );
????????}
????}
????[InstrumentationListener?( typeof ?(MyListener?))]
???? public ? class ?MyApplication
????{
????????[InstrumentationProvider( " DbConnect " )]
???????? public ? event ?EventHandler? < EventArgs? > ?OnDbConnect;
????}
?
MyApplication就是一個provider,OnDbConnect是provider的一個事件,MyListener中的ConnectObserved就是響應(yīng)OnDbConnect事件的處理代碼。
當(dāng)系統(tǒng)初始化MyApplication類的時候,會檢查特性中是否存在一個MyListener類型的listener,如果存在,也會初始化一個MyListener。然后會檢查MyApplication中所有的事件,查看那些被標(biāo)識了InstrumentationProvider特性。同時也會在MyListener中查看標(biāo)有InstrumentationConsumer特性的,相同名稱的方法。
3.2為組件提供儀表功能
一個應(yīng)用會包含很多的組件,例如數(shù)據(jù)庫組件。在這時候,可能需要儀表的不是應(yīng)用本身,而是這個組件。為組件實(shí)現(xiàn)儀表功能,要求你的應(yīng)用實(shí)現(xiàn)IInstrumentationEventProvider接口。下面的示例中,MyApplication就是一個應(yīng)用。
?

????{
???????? public ?MyListener?( string ?instanceName, bool ?a, bool ?b, bool ?c){}
????????[InstrumentationConsumerAttribute?( " DbConnect " )]
???????? public ? void ?ConnectObserved( object ?sender,EventArgs?e)
????????{
????????????Console?.WriteLine?( " I?saw?a?database?connect. " );
????????}
????}
???? public ? class ?MyApplication:IInstrumentationEventProvider?
????{
???????? private ?MyInstrumentationProvider?instrumentationProvider =
???????????? new ?MyInstrumentationProvider?();
???????? public ? object ?GetInstrumentationEventProvider()
????????{
???????????? return ?instrumentationProvider?;
????????}
????}
????[InstrumentationListener?( typeof ?(MyListener?))]
???? public ? class ?MyInstrumentationProvider
????{
????????[InstrumentationProvider( " DbConnect " )]
???????? public ? event ?EventHandler? < EventArgs > ?OnDbConnect;
???????? public ? bool ?IsWired
????????{
???????????? get { return ?OnDbConnect? != null ;}
????????}
????????
????}
? 通常系統(tǒng)會從MyApplication類的第一行開始查找InstrumentationListener特性。但是,在上面的例子中,沒有這個特性。因此,當(dāng)系統(tǒng)看到IInstrumentationEventProvider接口的時候,會執(zhí)行GetInstrumentationEventProvider方法,查找方法返回類型的InstrumentationListener特性,然后查找InstrumentationProvider特性。
3.3安裝儀表盤功能
在listener類中的儀表盤會添加HasInstallableResources特性。下面是一段代碼示例。
?

????[HasInstallableResources?]
????[PerformanceCountersDefinitionAttribute?( " Enterprise?Library?Data?Counters " ,
????????????????????????????????????????????? " CounterCategoryHelpResourceName " )]
???? public ? class ?DataInstrumentationListener:InstrumentationListener?
????{
????????[PerformanceCounter?( " Connections?Opend/sec " , " ConnectionOpenedCounterHelpResource " ,
?????????????????????????????System.Diagnostics.PerformanceCounterType?.RateOfCountsPerSecond32?)]
????????EnterpriseLibraryPerformanceCounter??connectionOpenedCounter;
????????
????}
?
?
?
?
未完待續(xù)。。。。。。。。。。。。。。。。。。。。。
微軟企業(yè)庫4.1學(xué)習(xí)筆記(十二)中間人Providers,設(shè)計時支持Design-Time Configuration和儀表盤Instrumentation
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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