首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >封装Lazy<T>

封装Lazy<T>
EN

Stack Overflow用户
提问于 2016-08-24 07:49:13
回答 1查看 97关注 0票数 0

在多次需要实现Lazy<T>模式之后,我想到了将整个模式放入类中以隐藏延迟实现的想法。

在“为我的服务加载单例配置对象”的情况下,我执行了如下操作:

代码语言:javascript
复制
public interface IConfigurationProvider<T>
{
    T GetConfiguration();
}

public abstract class SingletonConfigurationProvider<TConfiguration> : IConfigurationProvider<TConfiguration>
{
    private static readonly Lazy<TConfiguration> _lazy =
       new Lazy<TConfiguration>(_loadConfiguration);

    private static Func<TConfiguration> _loadConfiguration;

    private SingletonConfigurationProvider() { }
    public SingletonConfigurationProvider(Func<TConfiguration> LoadConfig)
    {
        _loadConfiguration = LoadConfig;
    }

    public TConfiguration GetConfiguration()
    {
        return _lazy.Value;
    }
}

我的目标是从“外部”获得这样做的简单性:

代码语言:javascript
复制
public class ConfigTest : SingletonConfigurationProvider<ObjectTest> 
{
    public ConfigTest()
        : base(Load)
    {
    }

    public static ObjectTest Load()
    {
        return new ObjectTest()
        {
            testInt = 3,
            testString = "Hi"
        };
    }
}

要点如下:

  • 它编译,但在运行时中断,"TypeInitialization异常“表示_loadConfiguration不能为null。是因为懒惰是在SingletonConfigurationProvider构造函数之前构建的吗?
  • 是否有可能在不破坏单例语义的情况下实现我想要的?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-24 08:00:37

你要寻找的抽象是一个回忆录功能。在这种函数中,您可以修改getter函数,使其实现一种“只执行一次”的模式。未经测试的代码,但大致如此;

代码语言:javascript
复制
public Func<T> Memoize(Func<T> slowFunction) {
    bool evaluated = false;
    T value = default(T);

    return () => {
        if (!evaluated) {
            value = slowFunction();
            evaluated = true;
        }

        return value;
    };
}

所以,你现在有一个函数,你可以这样使用;

代码语言:javascript
复制
Func<TConfiguration> onceOnlyLoad = Memoise(Load);

现在,您可以任意多次调用onceOnlyLoad(),并且它只在第一次调用它时加载配置。

如果需要,可以在内部使用Lazy<T>提供相同的行为。你说了算。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39117380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档