zoukankan      html  css  js  c++  java
  • 【翻译】使用Lazy<T>和抽象包装类延迟加载复杂的系统参数

    .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

  • 相关阅读:
    awk
    tac
    cat
    less
    more
    head
    vim
    linux安装redis
    Redis for Python开发手册
    Python3.x标准模块库目录
  • 原文地址:https://www.cnblogs.com/TomXu/p/2251413.html
Copyright © 2011-2022 走看看