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

AOP 實戰:實體集合更新 EntityListUpdatable 實作原始碼深度解析(上)

     編輯:關於C語言

系列簡介:FaibClass.Data 雙 AOP 應用架構

本框架實作兩個經典 AOP 場景:

  1. 實體集合更新:自動追蹤屬性異動,優化 SQL UPDATE
  2. 延遲載入:導航屬性首次存取時自動查詢資料庫

共同架構:Attribute → ContextProperty → MessageSink,基於 ContextBoundObject 訊息傳遞機制。

一、實體集合更新:問題與動機

傳統做法:每個屬性 set 手動呼叫 AddUpdateColumn("PropertyName"),侵入性強、易遺漏、維護困難。
AOP 方案:在類別加上 [EntityListUpdatable],自動攔截所有 set_ 呼叫,比較新舊值,異動時自動記錄。

二、EntityListUpdatableAttribute 完整原始碼


[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class EntityListUpdatableAttribute : Attribute, IContextAttribute, IContextProperty
{
    internal static string PropertyName = "EntityListUpdatable";

    public EntityListUpdatableAttribute() { }

    string IContextProperty.Name => PropertyName;
    void IContextProperty.Freeze(Context newContext) { }
    bool IContextProperty.IsNewContextOK(Context newCtx) => true;

    void IContextAttribute.GetPropertiesForNewContext(IConstructionCallMessage ctorMsg)
    {
        ctorMsg.ContextProperties.Add(new EntityListUpdatableProperty());
    }

    bool IContextAttribute.IsContextOK(Context ctx, IConstructionCallMessage ctorMsg)
    {
        return ctx.GetProperty(PropertyName) != null;
    }
}

介面職責對照

介面方法用途
IContextAttributeGetPropertiesForNewContext物件建構時,向新上下文添加對應 Property
IsContextOK驗證現有上下文是否已包含必要 Property
IContextPropertyName屬性識別名稱
Freeze上下文凍結時回調(通常空實作)
IsNewContextOK新上下文是否相容(檢查同名 Property 存在且型別正確)

三、訊息傳遞機制核心概念

  • MarshalByRefObject:跨上下文邊界以 Proxy 參考
  • ContextBoundObject:繼承自 MarshalByRefObject,啟用上下文屬性
  • IMessageSink:訊息接收器鏈節點,SyncProcessMessage 同步處理
  • IMethodCallMessage:方法呼叫訊息,含 MethodName、InArgs
  • IMethodReturnMessage:方法返回訊息,含 ReturnValue、OutArgs、Exception

四、為什麼選擇 ContextBoundObject?

  • 純 .NET Framework 內建,無第三方相依
  • 支援多 AOP 疊加(每個 Attribute 注入一個 Property/Sink)
  • 攔截粒度細:可區分同步/非同步、建構/方法/屬性/欄位
  • 已知代價:Proxy 呼叫、上下文切換、反射開銷

五、原始碼檔案結構

FaibClass.Data
├── EntityListUpdatableAttribute.cs
└── Aspect
    ├── EntityListUpdatableProperty.cs
    └── EntityListUpdatableSink.cs

總結

EntityListUpdatableAttribute 實作 IContextAttribute 與 IContextProperty,在物件建構階段向上下文註冊 EntityListUpdatableProperty,後者實作 IContributeObjectSink 提供 EntityListUpdatableSink。Sink 在 HandleMessage 中攔截 set_ 訊息,透過反射取得新舊值比較,異動時呼叫內部 AddUpdateColumn 記錄。下一篇將詳細解析 Sink 核心邏輯與效能考量。

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