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

????{
???????? 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就是一個(gè)provider,OnDbConnect是provider的一個(gè)事件,MyListener中的ConnectObserved就是響應(yīng)OnDbConnect事件的處理代碼。
當(dāng)系統(tǒng)初始化MyApplication類的時(shí)候,會(huì)檢查特性中是否存在一個(gè)MyListener類型的listener,如果存在,也會(huì)初始化一個(gè)MyListener。然后會(huì)檢查MyApplication中所有的事件,查看那些被標(biāo)識(shí)了InstrumentationProvider特性。同時(shí)也會(huì)在MyListener中查看標(biāo)有InstrumentationConsumer特性的,相同名稱的方法。
3.2為組件提供儀表功能
一個(gè)應(yīng)用會(huì)包含很多的組件,例如數(shù)據(jù)庫(kù)組件。在這時(shí)候,可能需要儀表的不是應(yīng)用本身,而是這個(gè)組件。為組件實(shí)現(xiàn)儀表功能,要求你的應(yīng)用實(shí)現(xiàn)IInstrumentationEventProvider接口。下面的示例中,MyApplication就是一個(gè)應(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)會(huì)從MyApplication類的第一行開(kāi)始查找InstrumentationListener特性。但是,在上面的例子中,沒(méi)有這個(gè)特性。因此,當(dāng)系統(tǒng)看到IInstrumentationEventProvider接口的時(shí)候,會(huì)執(zhí)行GetInstrumentationEventProvider方法,查找方法返回類型的InstrumentationListener特性,然后查找InstrumentationProvider特性。
3.3安裝儀表盤功能
在listener類中的儀表盤會(huì)添加HasInstallableResources特性。下面是一段代碼示例。
?

????[HasInstallableResources?]
????[PerformanceCountersDefinitionAttribute?( " Enterprise?Library?Data?Counters " ,
????????????????????????????????????????????? " CounterCategoryHelpResourceName " )]
???? public ? class ?DataInstrumentationListener:InstrumentationListener?
????{
????????[PerformanceCounter?( " Connections?Opend/sec " , " ConnectionOpenedCounterHelpResource " ,
?????????????????????????????System.Diagnostics.PerformanceCounterType?.RateOfCountsPerSecond32?)]
????????EnterpriseLibraryPerformanceCounter??connectionOpenedCounter;
????????
????}
?
?
?
?
未完待續(xù)。。。。。。。。。。。。。。。。。。。。。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(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ì)您有幫助就好】元
