首頁 培訓計劃 培訓課程 企業內訓 學員論壇 技術文章 成功案例 師資簡介 關于我們 在線留言  
.NET開發資料
【翻譯】使用Lazy和抽象包裝類延遲加載復雜的系統參數

文章來源:http://www.cnblogs.com/TomXu/archive/2011/11/18/2251413.html 作者: 湯姆大叔 發布日期:2012-02-17
打 印】【關 閉

.Net Framework4.0里的Lazy<T>雖然提供給我們很好用的延遲加載功能,但是其中需要load的值和值的loader代碼是單獨分開的,使用起來不是很方便,有沒有什么好方法來解決這一問題呢?

 

原始Lazy實現的問題:

如下代碼是我們常用的Lazy代碼

 

class Program
{
static void Main(string[] args)
{
var temperature = new Lazy<int>(LoadMinimalTemperature);

Console.WriteLine("Minimal room temperature: " + temperature.Value);
Console.ReadLine();
}

protected static int LoadMinimalTemperature()
{
var returnValue = 0;

// Do complex stuff here

return true;
}
}

問題是,如果我們需要使用Lazy來load多個參數或者屬性,那維護起來就非常麻煩,如果能將這些參數聲明成單獨的class類,就好多了。

 聲明參數的基類:

首先我們需要為所有Lazy load的參數提供一個基類,這是Lazy<T>的一個wrapper包裝類,并且包括一個模板方法,我們必須重寫這個方法以便提供需要load的數據。

public abstract class LazyParameter<T>
{
private Lazy<T> _lazyParam;

public LazyParameter()
{
_lazyParam = new Lazy<T>(Load);
}

protected abstract T Load();

public T Value
{
get { return _lazyParam.Value; }
}
}

也可以繼承Lazy<T>,但我沒補希望用它,因為Lazt<T>有6個構造函數需要注意,而且我也不希望暴露Lazy<T>原有公開的interface方法和參數。

 

創建參數類:

現在,來創建我們的第一個參數類,注意到我們僅僅實現了Load方法的重寫。

public class MinimalRoomTemperature : LazyParameter<int>
{
protected override int Load()
{
var returnValue = 0;

// Do complex stuff here

return returnValue;
}
}

使用起來非常簡單,下面是調用代碼:

class Program
{
static void Main(string[] args)
{
var parameter = new MinimalRoomTemperature();
Console.WriteLine("Minimal room temperature: " + parameter.Value);
Console.ReadLine();
}
}


結論:

Lazy<T>雖然十分有用,但是我不建議在程序里直接使用,通過這篇帖子里的包裝類來使用,相對來說十分方便。該基類使用了泛型,所以可以擴展出各種各樣的代碼。

 

網友評論:

有的網友建議如下的使用方式,也很不錯,但是每次都在聲明的時候寫邏輯代碼,簡單的話還可以,復雜的話,我覺得還是通過聲明單獨的類比較容易理解。

    public class LazyParameter<T>
{

private readonly Lazy<T> _lazyParam;

public LazyParameter(Func<T> load)
{
_lazyParam = new Lazy<T>(load);
}



public T Value
{
get { return _lazyParam.Value; }
}
}



//調用方式:

var temp = new LazyParameter<int>(() => 1 + 30).Value;

var page = new LazyParameter<string>(

() => HttpContext.Current.Request.QueryString["page"]

).Value;

其實以上代碼和Lazy<T>里帶有Func<T>的構造函數是差不多的,例如:

var lazyString = new Lazy<string>(() =>
{
// Here you can do some complex processing
// and then return a value.
Console.Write("Inside lazy loader");
return "Lazy loading!";
});


原文鏈接:http://weblogs.asp.net/gunnarpeipman/archive/2011/11/11/using-lazy-lt-t-gt-and-abstract-wrapper-class-to-lazy-load-complex-system-parameters.aspx

打 印】【關 閉

上一篇:配置Oracle本地Net服務名說明(圖解)
下一篇:
相關新聞
版權所有©威課網 粵ICP備13058727號