在 C# 中为依赖解析器创建延迟缓存值?

我正在使用 .Net core Web 应用程序。

在我的应用程序中,我使用它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但出现错误:

http://img4.mukewang.com/64aa78f1000120d806010351.jpg

问题:

我想我在这里走错路了。

如何创建 DI 接口类来公开重载操作的缓存属性?(不允许更改,外部Foo

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


森栏
浏览 78回答 1
1回答

GCT1015

您可以在 中仅声明getter IFoo,如下所示:public interface IFoo{&nbsp; &nbsp; Lazy<Task<int>> MyLazy { get; }&nbsp;}然后,从 C# 6 开始,您可以实现一个只读自动属性,它将实现接口成员并提供可在构造函数中使用的 setter:public class Foo : IFoo{&nbsp; &nbsp; public Lazy<Task<int>> MyLazy { get; }&nbsp; &nbsp; public Foo()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; MyLazy = new Lazy<Task<int>>(() => Task.FromResult(3));&nbsp;&nbsp; &nbsp; }}或者,如果您想在类中的其他位置设置它,您可以更改Foo.MyLazy为:private setpublic class Foo : IFoo{&nbsp; &nbsp; public Lazy<Task<int>> MyLazy { get; private set; }&nbsp; &nbsp; // ...}
打开App,查看更多内容
随时随地看视频慕课网APP