获取所有注册的泛型类



. 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();

最新更新