c# - Asp.Net Core:我应该在缓存服务上使用 AddScoped 还是 AddSingleton
问题描述
在一个 asp.net 核心应用程序中,我有一个依赖注入缓存服务,它本质上是一个围绕内置 MemoryCache 的包装器。
这是被缓存的示例类,它包含一些 Web 应用程序始终使用的枚举列表:
public class GetEnums
{
public List<MyEnum1> Ones { get; set; }
public List<MyEnum2> Twos { get; set; }
}
这是我的缓存服务类的示例方法调用,它只是检索 GetEnums 类:
public class CacheService: ICacheService
{
private IMemoryCache MemoryCache {get;set;}
public CacheService(IMemoryCache memoryCache)
{
MemoryCache = memoryCache;
}
public GetEnums GetEnums()
{
if (MemoryCache.TryGetValue("GetEnums", out GetEnums getEnums))
return getEnums;
getEnums = MyRepository.GetEnums();
MemoryCache.Set(CacheKeys.GetEnums, getEnums, _enumMemoryCacheEntryOptions);
return getEnums;
}
}
在我的 ConfigureServices 方法中,我想让这个类成为一个依赖注入的服务。我应该使用 AddScoped 还是 AddSingleton?也就是说,我应该这样做吗?
services.AddScoped(<ICacheService,CacheService>);
或这个?
services.AddSingleton(<ICacheService,CacheService>);
我有两个问题。
一,如果我选择 AddScoped:我的猜测是,由于我的缓存服务类只是 MemoryCache 的包装器,唯一的区别是用于为每个 Web 请求(AddScoped)创建缓存服务对象与一个实例的轻微开销对于应用程序(AddSingleton)。我猜如果我使用 AddScoped,.Net 运行时不会创建单独的 MemoryCache 实例。
二,如果我选择 AddSingleton,我是否需要在我的缓存服务的每个方法内围绕“MemoryCache.Set”调用添加“锁定”语句,如下所示:
private readonly object _cachelock = new ();
public GetEnums GetEnums()
{
if (MemoryCache.TryGetValue(CacheKeys.GetEnums, out GetEnums getEnums))
return getEnums;
lock(_cachelock)
{
if (MemoryCache.TryGetValue(CacheKeys.GetEnums, out getEnums))
return getEnums;
getEnums = MyRepository.GetEnums();
MemoryCache.Set(CacheKeys.GetEnums, getEnums, _enumMemoryCacheEntryOptions);
}
return getEnums;
}
解决方案
推荐阅读
- google-cloud-platform - 无法激活“DV360 卖家 API”。一直提示“权限不足,无法查看该产品的启用状态”。
- java - 如何访问此 Java 对象中的这些属性
- python - 从 webscraper 清理表数据
- sql - 如何确定 T-SQL 中每周的工作时间总和?
- spring - 是否有更改返回像 response.png 而不是 response.bin 的 png 文件
- c++ - SDL2 混音器问题:无法启动进程
- c# - c#编组尝试将结构从cpp dll返回到c#应用程序,该应用程序被分配为它自己的dll
- java - Quarkus Swagger-UI 授权
- docker - blackbox 导出器是否支持 telnet 探测?
- windows - 我如何读取另一个线程的 cpu 寄存器状态?(视窗)