我想用PostSharp實現延遲加載屬性。如何使用PostSharp實現延遲加載?
要長話短說,而不是寫
SomeType _field = null;
private SomeType Field
{
get
{
if (_field == null)
{
_field = LongOperation();
}
return _field;
}
}
我還想寫
[LazyLoadAspect]
private object Field
{
get
{
return LongOperation();
}
}
所以,我確定,我需要發出一些代碼的類來生成支持字段,以及在getter方法內部以執行測試。
使用PostSharp,我正在考慮重寫CompileTimeInitialize
,但我錯過了編譯代碼的句柄知識。
編輯: 問題可以擴展到任何參數的方法,如:
SomeType _lazyLoadedField = null;
SomeType LazyLoadableMethod()
{
if(_lazyLoadedField ==null)
{
// Long operations code...
_lazyLoadedField = someType;
}
return _lazyLoadedField ;
}
將成爲
[LazyLoad]
SomeType LazyLoadableMethod()
{
// Long operations code...
return someType;
}
Thanfs Dustin。我之前已經閱讀過您的文章,但是我一直很困惑,因爲我將它理解爲特定於IoC的內容,並且看不到像LongOperation這樣的調用會發生在哪裏。我會用新的眼睛仔細觀察。 – remio 2012-03-02 18:19:06
如果您始終要調用相同的方法,請將您的調用更改爲LongOperation。當你想做不同的事情時,問題就出現了,你需要創建不同的方面,或者像服務定位器或工廠那樣使用更通用的方法。 – 2012-03-02 18:37:52
好的,謝謝,這是我懷疑的。的確,我正在尋找一些通用的東西。正如我的問題所提出的,我想實現我的財產,無論哪個方面,然後,可能稍後決定延遲加載其價值。正如nemesv所建議的那樣,.Net4懶惰,但採用AOP方式。 – remio 2012-03-02 20:18:13