Enterprise Library 3.0 引入 Policy Injection Application Block (PIAB),提供聲明式 AOP 框架,將 Crosscutting Concern (驗證、快取、日誌、交易、授權、例外處理、效能計數器) 從業務邏輯分離。本文介紹核心概念與首個完整範例。
傳統寫法將基礎設施邏輯硬編碼在業務方法中:
public void ProcessOrder(Order order)
{
Authorize(); Audit();
using (var scope = new TransactionScope())
{
try { OrderDataAccess(); }
catch (Exception ex) { HandleException(ex); Log(); }
}
}
缺點:大量 Copy/Paste、耦合導致變更困難、初級開發者難以理解基礎設施邏輯用途。
PIAB 解決方案:透過Policy = CallHandler + MatchingRule 將横切關注點注入方法呼叫鏈,業務碼保持純粹。
| 概念 | 說明 | 內建實作範例 |
|---|---|---|
| CallHandler | 封裝具體横切邏輯 | Authorization、Caching、ExceptionHandling、Logging、Validation、PerformanceCounter |
| MatchingRule | 決定 Handler 套用目標方法 | Assembly、CustomAttribute、Namespace、MethodSignature、Type/Method Name |
| Policy | MatchingRule + CallHandler 組合 | 一個 Policy 可含多個 Handler,一個方法可套用多個 Policy |
支援屬性與組態檔兩種聲明方式,可自訂 CallHandler/MatchingRule。
Microsoft.Practices.EnterpriseLibrary.PolicyInjectionMicrosoft.Practices.EnterpriseLibrary.PolicyInjection.CallHandlerspublic class OrderProcessor : MarshalByRefObject
{
public Order Process(Order order)
{
Console.WriteLine("OrderProcessor.Process() invoked!");
return order;
}
}
public class Order { }
static void Main()
{
var processor = PolicyInjection.Create<OrderProcessor>();
var order = new Order();
processor.Process(order); // 第一次
processor.Process(order); // 第二次,相同參數
}
match="Process"


<policyInjection>
<policies>
<add name="Policy">
<matchingRules>
<add type="...MemberNameMatchingRule" name="Member Name Matching Rule">
<matches><add match="Process" /></matches>
</add>
</matchingRules>
<handlers>
<add type="...CachingCallHandler" name="Caching Handler" expirationTime="00:05:00" />
<add type="...LogCallHandler" name="Logging Handler" logBehavior="After" ... />
</handlers>
</add>
</policies>
</policyInjection>

Process,但實際只執行一次 → Caching 生效 (Key 為參數物件)
後續文章將深入實作原理、自訂 CallHandler 開發與進階排序擴充。