快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

和记娱乐App_集报网



之前我谈到,在通俗环境下我们可以很轻松地写出过一个代理类,用来处置惩罚延迟加载的环境。当时给出了一个很简单的做法,也便是指创建基类,覆盖它的一些属性实现,类似这种:

public class LazySomeClass : SomeClass

{

public override int SomeID

{

get

{

return this.LazySomeID.Value;

}

set

{

this.LazySomeID.Value = value;

}

}

public Lazy LazySomeID { get; set; }

}

不过我当时也提到,这么做可能够用,然则也有一些毛病。例如,它破坏了SomeID属性中包孕的营业逻辑。可能SomeID蓝本会包孕一些验证逻辑,或和别的一个属性加以同步,或提议INotifyPropertyChanging/Changed中的事故。这也是我觉得NHibernate的延迟加载措施不妥的缘故原由&mdas和记娱乐Apph;—其他还有一些缺陷有时机在评论争论。

是以我又想了想,抱负中的延迟加载要领应该是什么样的呢?例如,同样是个SomeClass类,此中部分属性容许“设置”延迟加载:

public class SomeClass

{

public SomeClass() { }

public SomeClass(int i) { }

public virtual int L和记娱乐AppazyInt { get; set; }

public virtual bool L和记娱乐AppazyBoolean { get; set; }

public int EagerInt { get; set; }

public bool EagerBoolean { get; set; }

// some other members...

}

假如是一个较为合理的延迟代理类,我觉得它的写法应该是这样的:

public class LazySomeClass : SomeClass

{

public override int LazyInt

{

get

{

if (!this.m_lazyIntLoaded)

{

if (this.m_lazyIntLoader != null)

{

base.LazyInt = this.m_lazyIntLoader();

this.m_lazyIntLoader = null;

}

this.m_lazyIntLoaded = true;

}

return base.LazyInt;

}

set

{

base.LazyInt = value;

this.m_和记娱乐ApplazyIntLoaded = true;

this.m_lazyIntLoader = null;

}

}

private bool m_lazyIntLoaded = false;

private Func m_lazyIntLoader = null;

public Func LazyIntLoader

{

get

{

return this.m_lazyIntLoader;

}

set

{

this.m_lazyIntLoader = value;

this.m_lazyIntLoaded = false;

}

}

}

假如我们必要为Lazy和记娱乐AppInt属性设置延迟加载,那么可以设置LazyIntLoader属性,它是一个Func委托工具。这种实现要领看上去繁杂,不过它有必然的合理性:

每个Loader只履行一次,直到供给新的Loader。

Loader履行后,会赋值给base.LazyInt,维持基类的营业逻辑。

从base.LazyInt读取,同样维持基类的营业逻辑。

假如不必要延迟加载,那么属性的行径维持不变。

此中第4点异常紧张,这意味着这是一种可以“标准化”的延迟加载代理类的标准写法。我们可以在运行时应用Emit天生新的类型,承袭目标类,为每个virtual属性在子类中重写一份。因为在默认环境下属性的行径不会改变,是以这样的代理类不会有问题。以致,“帮助类库”的接口我也想好了:

var builder = LazyFactory.Create(() => new SomeClass(10)

{

EagerInt = 10,

EagerBoolean = true

});

SomeClass value = builder

.Setup(c => c.LazyInt, () => GetLazyValue())

.Setup(c => c.LazyBoolean, () => GetLazyValue())

.Create();

您有兴趣实现一下吗?

出处:http://www.cnblogs.com/JeffreyZhao/archive/2009/09/07/standard-lazy-proxy.html

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: