为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
森栏 2023-07-09 17:07:25
我正在使用 .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但出现错误:问题:我想我在这里走错路了。如何创建 DI 接口类来公开重载操作的缓存属性?(不允许更改,外部Foo)完整的关闭:我们需要从数据库加载一些要在整个应用程序中使用的行,并且不想每次都加载它们。
查看完整描述

1 回答

?
GCT1015

TA贡献1827条经验 获得超4个赞

您可以在 中仅声明getter IFoo,如下所示:


public interface IFoo

{

    Lazy<Task<int>> MyLazy { get; } 

}

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


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; }


    // ...

}


查看完整回答
反对 回复 2023-07-09
  • 1 回答
  • 0 关注
  • 114 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信