. NET Core项目中,我们在DI中注册了通用类来进行缓存管理。通过这种方式,我们可以按照注入的泛型参数对缓存进行逻辑分区。
services.AddSingleton(typeof(IMemoryCacheManager<>), typeof(MemoryCacheManager<>));
我们像这样注入它:
IMemoryCacheManager<Class1> cache
IMemoryCacheManager<Class2> cache
但有时我需要一次获得IMemoryCacheManager的所有实例,以清除缓存(例如)。我可以用DI实现这个吗?
编辑1以下代码编译:
var services =_serviceProvider.GetServices(typeof(IMemoryCacheManager<>));
foreach (ICacheManager item in services)
item.Clear();
但是我有一个例外:提供的泛型参数的数量不等于泛型定义类型的数量
我通过创建一个CacheTracker类(作为单例)来解决这个问题,它在缓存类被实例化时保持跟踪。下面是代码,也许能帮上忙。
CacheTracker.cs
public class CacheTracker : ICacheTracker
{
private readonly IList<ICacheManager> _cacheList;
public CacheTracker()
{
this._cacheList = new List<ICacheManager>();
}
public void AddCache(ICacheManager cache)
{
this._cacheList.Add(cache);
}
public IReadOnlyList<ICacheManager> GetCaches(Type cacheType)
{
var caches =
from cache in _cacheList
where
cache.GetType().GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == cacheType) &&
cache.GetType().IsClass
select cache;
return caches
.ToList()
.AsReadOnly();
}
}
ICacheTracker.cs
public interface ICacheTracker
{
IReadOnlyList<ICacheManager> GetCaches(Type cacheType);
void AddCache(ICacheManager cache);
}
在每个缓存实现中
public MemoryCacheManager(...
ICacheTracker cacheTracker)
{
...
cacheTracker.AddCache(this);
}
当我需要使用所有缓存
foreach (ICacheManager item in _cacheTracker.GetCaches(typeof(IMemoryCacheManager<>)))
item.Clear();