程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> AOP的兩個應用(上)(1)

AOP的兩個應用(上)(1)

編輯:關於C語言

AOP的兩個應用:實體集更新(DateEntityListUpdate)、延遲加載(LazyLoad)(上)

在FaibClass.Data中,有兩個AOP的應用,它們分別是實體集更新(DateEntityListUpdate)、延遲加載 (LazyLoad),目前的DataEntity繼承於ContextBoundObject,剛剛從網上看到ContextBoundObject的損耗非常大,但自己測試了一下,應該說影響不是很大,所以暫時不打算使用靜態注入了。

注,兩個AOP都采用Attribute--Property--Sink的結構,每個類的具體功能請查閱相關的技術資料。

一、實體集更新(DateEntityListUpdate)

在前台設置一個實體的屬性,我們在更新整個實體集到數據庫的時候,並不知道哪些屬性更改過,如果全部更新,將造成不必要的浪費,所以引入了這個概念。如果我們不這樣做,模型類的每個屬性set後將添加一句代碼AddUpdateColumn。

這裡使用了.Net的消息鏈進行處理,因為實體類上還可能使用了其他的AOP。

EntityListUpdatableAttribute類

//*******************************************************************
// 模塊:指示實體對象可被集合更新
// 日期:2009-7-29 1:05
// 作者:Faib
// 版權:Copyright Faib Studio 2009
// 官網:http://www.faib.Net.cn
// 郵箱:[email protected]
// 備注:
//*******************************************************************
using System;
using System.Runtime.Remoting.Contexts;
using System.Runtime.Remoting.Activation;
using FaibClass.Data.ASPect;
namespace FaibClass.Data
{
    /// <summary>
    /// 指示實體的屬性更改後,可以使用Update更新整個實體集,如果不指定此特性,實體的DataState無法置為ModifIEd。
    /// </summary>
    [AttributeUsage(AttributeTargets.Class, AllowMultiple=false)]
    public class EntityListUpdatableAttribute : Attribute, IContextAttribute, IContextProperty
    {
        internal static string propertyName = "EntityListUpdatable";
        /// <summary>
        /// 構造屬性。
        /// </summary>
        public EntityListUpdatableAttribute()
        {
        }
        string IContextProperty.Name
        {
            get { return propertyName; }
        }
        void IContextProperty.Freeze(Context newContext)
        {
        }
        bool IContextProperty.IsNewContextOK(Context newCtx)
        {
            return true;
        }
        void IContextAttribute.GetPropertIEsForNewContext(IConstructionCallMessage ctorMsg)
        {
            IContextProperty interceptProperty = new EntityListUpdatableProperty();
            ctorMsg.ContextPropertIEs.Add(interceptProperty);
        }
        bool IContextAttribute.IsContextOK(Context ctx, IConstructionCallMessage ctorMsg)
        {
            if (ctx.GetProperty(propertyName) == null)
            {
                return false;
            }
            return true;
        }
    }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved