c# - 在 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
)
完全关闭:我们需要从我们的数据库中加载一些要在整个应用程序中使用的行,并且不想每次都加载它们。
解决方案
您可以只声明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; }
// ...
}
推荐阅读
- timestamp - 如何在不同的计算机上准确记录同步时间?
- node.js - Mongoose 中间件 schema.pre('save', ...)
- c# - C# 常量数组搜索
- python-3.x - 如何使用 python 为简单的 e2e 聊天应用程序添加媒体支持
- laravel - 如何修改 Laravel API 资源收集响应以在“数据”包装器中包含另一个“数据”包装器?
- asp.net-core - 聚合异常 Asp.Net Core 5.0
- maven - java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory - 与 Appium 相关
- docker - 如何在 docker 中启用/禁用 buildkit?
- google-sheets - 谷歌表 - 自定义时间戳脚本不适用于 Andriod
- firebase - Flutter:动态链接未启动应用程序