WEB开发网
开发学院软件开发C语言 AOP的两个应用:实体集更新(DateEntityListUpdate... 阅读

AOP的两个应用:实体集更新(DateEntityListUpdate)、延迟加载(LazyLoad)(上)

 2010-09-30 21:02:56 来源:WEB开发网   
核心提示:在FaibClass.Data中,有两个AOP的应用,AOP的两个应用:实体集更新(DateEntityListUpdate)、延迟加载(LazyLoad)(上),它们分别是实体集更新(DateEntityListUpdate)、延迟加载 (LazyLoad),目前的DataEntity继承于ContextBoundO

在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
// 邮箱:faib920@126.com
// 备注:
//*******************************************************************
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 3 4 5  下一页

Tags:AOP 两个 应用

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接