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

????{
???????? 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就是響應OnDbConnect事件的處理代碼。
當系統初始化MyApplication類的時候,會檢查特性中是否存在一個MyListener類型的listener,如果存在,也會初始化一個MyListener。然后會檢查MyApplication中所有的事件,查看那些被標識了InstrumentationProvider特性。同時也會在MyListener中查看標有InstrumentationConsumer特性的,相同名稱的方法。
3.2為組件提供儀表功能
一個應用會包含很多的組件,例如數據庫組件。在這時候,可能需要儀表的不是應用本身,而是這個組件。為組件實現儀表功能,要求你的應用實現IInstrumentationEventProvider接口。下面的示例中,MyApplication就是一個應用。
?

????{
???????? 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 ;}
????????}
????????
????}
? 通常系統會從MyApplication類的第一行開始查找InstrumentationListener特性。但是,在上面的例子中,沒有這個特性。因此,當系統看到IInstrumentationEventProvider接口的時候,會執行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;
????????
????}
?
?
?
?
未完待續。。。。。。。。。。。。。。。。。。。。。
微軟企業庫4.1學習筆記(十二)中間人Providers,設計時支持Design-Time Configuration和儀表盤Instrumentation
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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