在一个asp.net core应用程序中,我有一个依赖注入的缓存服务,它实质上是内置MemoryCache的包装器。
这里是被缓存的示例类,它包含了一些枚举列表,这些枚举始终被Web应用程序使用:
下面是我缓存服务类的一个示例方法调用,它只是获取 GetEnums 类:
在我的ConfigureServices方法中,我想将这个类作为依赖注入服务。我应该使用AddScoped还是AddSingleton?也就是说,我应该这样做吗?
这里是被缓存的示例类,它包含了一些枚举列表,这些枚举始终被Web应用程序使用:
public class GetEnums
{
public List<MyEnum1> Ones { get; set; }
public List<MyEnum2> Twos { get; set; }
}
下面是我缓存服务类的一个示例方法调用,它只是获取 GetEnums 类:
以下是缓存服务类的方法示例,它仅检索 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,我是否需要在我的缓存服务的每个方法周围添加“lock”语句来管理“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;
}
AddScoped
对于这个有什么意义? - Ids van der Zee