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

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

編輯:關於C語言
、延遲加載(LazyLoad)

沒有仔細研究過其他框架的延遲加載是怎麼實現的,自己還是基於.Net的消息機制做了這個功能。

LazyLoadableAttribute類

//*******************************************************************
// 模塊:延遲加載的屬性
// 日期:2009-9-19 14:23:22
// 作者: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>
    /// 指示該實體中的子實體集、引用實體、引用屬性可延遲載入。
    /// </summary>
    [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
    public class LazyLoadableAttribute : Attribute, IContextAttribute, IContextProperty
    {
        internal static string propertyName = "LazyLoadable";
     
        /// <summary>
        /// 構造屬性。
        /// </summary>
        public LazyLoadableAttribute()
        {
        }
        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 LazyLoadableProperty();
            ctorMsg.ContextPropertIEs.Add(interceptProperty);
        }
        bool IContextAttribute.IsContextOK(Context ctx, IConstructionCallMessage ctorMsg)
        {
            if (ctx.GetProperty(propertyName) == null)
            {
                return false;
            }
              
            return true;
        }
    }
}

LazyLoadableProperty類

//*******************************************************************
// 模塊:延遲加載的上下文屬性
// 日期:2009-9-19 14:09:46
// 作者:Faib
// 版權:Copyright Faib Studio 2009
// 官網:http://www.faib.Net.cn
// 郵箱:[email protected]
// 備注:
//*******************************************************************
using System;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Contexts;
namespace FaibClass.Data.ASPect
{
    /// <summary>
    /// 延遲加載的上下文屬性。
    /// </summary>
    internal class LazyLoadableProperty : IContextProperty, IContributeObjectSink
    {
        void IContextProperty.Freeze(Context newContext)
        {
        }
        string IContextProperty.Name
        {
            get { return LazyLoadableAttribute.propertyName; }
        }
        bool IContextProperty.IsNewContextOK(Context newCtx)
        {
            LazyLoadableProperty property = 
                newCtx.GetProperty(LazyLoadableAttribute.propertyName) as LazyLoadableProperty;
            if (property == null)
            {
                return false;
            }
            return true;
        }
        IMessageSink IContributeObjectSink.GetObjectSink(MarshalByRefObject obj, IMessageSink nextSink)
        {
            IMessageSink sink = new LazyLoadableSink(obj, nextSink);
            return sink;
        }
    }
}

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