首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

Enterprise Library Policy Injection Application Block 入門 (一):AOP 關注點分離、PIAB 核心概念與首個驗證/快取/日誌整合範例

     編輯:關於.NET

Enterprise Library 3.0 引入 Policy Injection Application Block (PIAB),提供聲明式 AOP 框架,將 Crosscutting Concern (驗證、快取、日誌、交易、授權、例外處理、效能計數器) 從業務邏輯分離。本文介紹核心概念與首個完整範例。

Business Logic 與 Infrastructure Logic 分離必要性

傳統寫法將基礎設施邏輯硬編碼在業務方法中:

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 將横切關注點注入方法呼叫鏈,業務碼保持純粹。

PIAB 核心概念

概念說明內建實作範例
CallHandler封裝具體横切邏輯Authorization、Caching、ExceptionHandling、Logging、Validation、PerformanceCounter
MatchingRule決定 Handler 套用目標方法Assembly、CustomAttribute、Namespace、MethodSignature、Type/Method Name
PolicyMatchingRule + CallHandler 組合一個 Policy 可含多個 Handler,一個方法可套用多個 Policy

支援屬性與組態檔兩種聲明方式,可自訂 CallHandler/MatchingRule。

快速上手:主控台應用程式整合 Caching + Logging

Step 1:建立專案並加入參考

  • Microsoft.Practices.EnterpriseLibrary.PolicyInjection
  • Microsoft.Practices.EnterpriseLibrary.PolicyInjection.CallHandlers

Step 2:定義業務類別 (須繼承 MarshalByRefObject)

public class OrderProcessor : MarshalByRefObject
{
    public Order Process(Order order)
    {
        Console.WriteLine("OrderProcessor.Process() invoked!");
        return order;
    }
}
public class Order { }

Step 3:主程式呼叫 (透過 PolicyInjection.Create 建立 Proxy)

static void Main()
{
    var processor = PolicyInjection.Create<OrderProcessor>();
    var order = new Order();
    processor.Process(order); // 第一次
    processor.Process(order); // 第二次,相同參數
}

Step 4:組態工具設定 (app.config)

  1. 新增 Logging Application Block (事件日誌追蹤器、文字格式化)
  2. 新增 Policy Injection Application Block → 新增 Policy
  3. Policy → Matching Rules → 新增 Method Name Matching Rule,match="Process"
  4. Policy → Handlers → 新增 Caching Call Handler (預設 5 分鐘過期) + Logging Call Handler (After 行為、含參數/呼叫堆疊/時間、分類 Audit)

新增 Logging Block

Method Name Matching Rule

Logging Handler 設定

產生的組態檔片段

<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 為參數物件)
  • 事件檢視器出現兩筆 Audit 記錄 (Before/After) → Logging 生效

事件日誌記錄

後續文章將深入實作原理、自訂 CallHandler 開發與進階排序擴充。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved