沒有仔細研究過其他框架的延遲加載是怎麼實現的,自己還是基於.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;
}
}
}