首页 > 解决方案 > 在 C# 中为依赖解析器创建延迟缓存值?

问题描述

我正在使用 .Net 核心网络应用程序。
在我的应用程序中,我使用Lazy它来将大量耗时的操作缓存到 Lazy 值中:

interface IFoo
{
     Lazy<Task<int>> MyLazy { get;   set; }

}

class Foo : IFoo
{
    public Lazy<Task<int>> MyLazy { get;    set; }

    public Foo()
    {
        MyLazy = new Lazy<Task<int>>(() => /*heavy operation*/ Task.FromResult(3));
    }

}

当然,我不想在构造函数中运行繁重的操作,但只有在需要时,然后缓存值。懒惰的财产很好恕我直言。
值得一提:我确实打算使用.AdddSingleton<Ifoo,Foo>.

所以现在我可以注入IFoo并获得MyLazy财产。

但我不想set公开。我试图将其更改为protected set但出现错误:

在此处输入图像描述

问题:

我想我在这里走错了路。

如何创建 DI-Interface-Class 来公开重型操作的缓存属性?(不允许改变它,在外面Foo

完全关闭:我们需要从我们的数据库中加载一些要在整个应用程序中使用的行,并且不想每次都加载它们。

标签: c#.net-core

解决方案


您可以声明getter in IFoo,如下所示:

public interface IFoo
{
    Lazy<Task<int>> MyLazy { get; } 
}

然后,从 C# 6 开始,您可以实现一个只读自动属性,该属性将实现接口成员并提供可在构造函数中使用的设置器:

public class Foo : IFoo
{
    public Lazy<Task<int>> MyLazy { get; }

    public Foo()
    {
        MyLazy = new Lazy<Task<int>>(() => Task.FromResult(3)); 
    }
}

或者,如果您想在班级的其他地方设置它,您可以更改Foo.MyLazy为:private set

public class Foo : IFoo
{
    public Lazy<Task<int>> MyLazy { get; private set; }

    // ...
}

推荐阅读