22
人物
《Enterprise Library深入解析與靈活應用》博文係列匯總
Enterprise Library是微軟P&P部門開發的眾多Open source框架中的一個,最新的版本已經出到了4.1。由於接觸Enterprise Library已經有很長的一段時間,在實際的項目中使用的頻率也很高。對此有了一些積累,希望通過這個新的係列和廣大網友一起分享和交流。本係列假設讀者已經對Enterprise Library有一定的了解,故而不會對各個Application Block的基本原理和編程模型進行介紹,而把側重點放在Enterprise Library深層次的實現原理、設計模式的應用、有效擴展和最佳實踐上。
PIAB是基於Remoting的原理通過Method Interception的方式實現了AOP(而另一種常見的方式是基於IL Injection)。要使應用在目標對象的CallHandler發揮作用,需用通過PolicyInjecctor(默認為Remoting PolicyInjection)進行對象的創建。而實現Unity和PIAB集成的途徑就是讓Unity Container使用進行對象的創建。
Unity是建立在ObjectBuilder之上的,而ObjectBuilder是整個Enterprise Library以及P&P其他開源框架(比如Smart Client Software Factory)的基石。ObjectBuilder,顧名思義,就是進行對象創建的組件。而ObjectBuilder進行對象創建的方式是基於策略的(Strategy based object creation),他通過將不同的策略運用到對象創建(或釋放回收)的不同的階段,而從提供了一個功能強大的、極具擴展的對象創建的框架。而要實現我們的目標,首先需要創建自定義的BuilderStrategy…
[第2篇]:通過SqlDependency實現Cache和Database的同步
對於一個真正的企業級的應用來說,Caching肯定是一個不得不考慮的因素,合理、有效地利用Caching對於增強應用的Performance(減少對基於Persistent storage的IO操作)、Scalability(將數據進行緩存,減輕了對Database等資源的壓力)和Availability(將數據進行緩存,可以應對一定時間內的網絡問題、Web Service不可訪問問題、Database的崩潰問題等等)。Enterprise Library的Caching Application Block為我們提供了一個易用的、可擴展的實現Caching的框架。借助於Caching Application Block,Administrator和Developer很容易實現基於Caching的管理和編程。由於Caching的本質在於將相對穩定的數據常駐內存,以避免對Persistent storage的IO操作的IO操作,所以有兩個棘手的問題:Load Balance問題;Persistent storage和內存中數據同步的問題。本篇文章提供了一個解決方案通過SqlDependency實現SQL Server中的數據和Cache同步的問題。
最近在做一個Smart Client Software Factory的項目。熟悉SCSF或者CAB的都應該很清楚MVP這種設計模式。MVP是MVC的一種變體,View和Mode分別關注於UI的呈現和業務模型,View和Mode完全分離,View通過Presenter實現對業務模型的訪問,Presenter“間接”地調用View實現對UI的操作。對於MVP中的異常處理,我們是直接通過Enterprise Library的Exception Handling Application Block來實現的。具體的做法是:在View中的每個控件的事件中添加try/catch block, 並在catch中通過ExceptionPolicy實現對異常的處理。這樣導致的問題是,相同的代碼重複散布於整個應用的各個角落,所以我又這樣的想法:通過Policy Injection以AOP的方式實現對異常的處理,當有了這個想法後,我又多想了一步,何不再將Unity也一並整合進來?
微軟Enterprise Library ELAB(Exception Handling Application Block)提供了一種基於策略(Policy)的異常處理方式,在不同的環境中,比如多層架構中不同的層次中,我們可以定義不同的異常處理策略。對於ELAB來說,Exception Handling Policy = Exception Type + Exception Handler(s) ,也就是說異常處理策略規定了對於某種類型的類型需要通過那些Exception Handler去處理。從這種意義上講,ELAB的異常處理機製是基於Exception Type的,異常的類型是我們處理異常的最小粒度。對於一個確定的異常處理策略,在不同場合拋出的同種類型的異常,都會使用相同的Exception Handler去處理。舉個例子,對於一個基於SQL Server的Data Access操作,對於數據庫連接失敗和違反數據一致性約束,都會拋出SqlException。這兩種情況對於ELAB都是等效的,因為它隻能根據異常的類型進行異常處理。
在很多情況下,這種基於異常類型級別的異常處理並不能解決我們實際異常處理的問題。我們往往需要粒度更細的異常處理機製:對於拋出的同一種類型的異常,根據異常對象具體的屬性值進行相應的異常處理。
這個工具執行一組批處理,也可以看成是一個Sequential Workflow的執行器,我把它成為Batch Job Executor。在使用Batch Job Executor過程中,通過配置可以對批處理的每個步驟、或者是Workflow的每個Activity進行自由地定義。從功能上將,這個小工具僅僅是個小玩意兒,不登大雅之堂。 不過考慮到Batch Job Executor的涉及和實現是基於Enterprise Library典型的實現方式,比如基於EL的配置和對象創建方式,對於那些希望進一步了解EL的讀者,或許可以通過這個小小的例子一窺EL的設計原理。對於那些EL的設計不時很了解的讀者,對於以下的內容,可能在理解上可能比較困難。最好是下載源代碼,結合下麵的介紹,希望會幫助了更好的理解EL。(Source Code 下載:https://files.cnblogs.com/artech/Artech.BatchJobExecutor.zip)
[第6篇]: 自己動手創建迷你版AOP框架
基於Enterprise Library PIAB的AOP框架已經在公司項目開發中得到廣泛的使用,但是最近同事維護一個老的項目,使用到了Enterprise Library 2,所以PIAB是在Enterprise Library 3.0中推出的,所以不同直接使用。為了解決這個問題,我寫了一個通過方法劫持(Method Interception)的原理,寫了一個簡易版的AOP框架。
[第7篇]: 再談PIAB與Unity之間的集成
在EnteLib中,PIAB(Policy Injection Application Block)和Unity的定位是輕量級的AOP框架和IoC容器(Container)。通過PIAB,我們可以將一些業務無關的crosscutting concern定義於相應的CallHandler中,通過Attribute聲明或者配置應用到承載業務邏輯的目標方法上。而通過Unity提供的IoC容器(或者DI容器),即UnityContainer,很好地實現了依賴的動態注入,從而實現了組件之間、模塊之間或者服務之間的鬆耦合。
Unity完全建立在ObjectBuilder2之上,顧名思義,這是一個用於創建對象的基礎組件。ObjectBuilder2提供了一種具有高可擴展性的、基於策略(Strategy Based)的對象創建框架,它不僅僅是Unity的基礎組件,也是整個EnterLib和Software Factory的基石。而PIAB通過方法調用劫持(Method Call Interception)的機製實現了策略注入(Policy Injection)。PIAB提供了不同的方法劫持機製,最為典型的就是基於TransparentProxy(可以參考我的PIAB係列文章)和代碼生成(比如動態生成一個繼承自目標類型的子類,通過Override掉相應的Virtual方法實現策略注入;或者動態生成一個實現了目標接口的類型,實現相應的方法實現策略注入)。PIAB需要通過特殊的機製創建可被劫持(Interceptable)對象,而UnityContainer本質上是一個創建對象的容器,如果能夠使UnityContainer按照PIAB的要求創建可被劫持(Interceptable)對象,那麼就能實現兩者之間的集成。(Source Code從這裏下載)
[第8篇]: WCF與Exception Handling AppBlock集成[上篇][下篇]
在《WCF技術剖析(卷1)》的最後一章,我給出了一個具體的應用WCF的分布式應用實例,我把這個實例命名為PetShop。在這個例子中,我利用WCF的擴展實現了一些設計、架構模式,比如AOP、IoC等。看過本書的讀者,一定還記得我還通過WCF擴展實現了於微軟企業庫(Enterprise Library)異常處理應用塊(Exception Handling Application Block:EHAB)的集成。當時由於缺乏相應的背景知識,不可能介紹具體的實現,現在我們可以詳細來講述這是如何實現的。 (Source Code從這裏下載)
微信公眾賬號:大內老A
微博:www.weibo.com/artech
如果你想及時得到個人撰寫文章以及著作的消息推送,或者想看看個人推薦的技術資料,可以掃描左邊二維碼(或者長按識別二維碼)關注個人公眾號(原來公眾帳號蔣金楠的自媒體將會停用)。
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁麵明顯位置給出原文連接,否則保留追究法律責任的權利。
最後更新:2017-10-30 11:04:52