C# 简单注入器-为EF核心缓存创建通用装饰器

C# 简单注入器-为EF核心缓存创建通用装饰器,c#,.net-core,simple-injector,ef-core-2.2,C#,.net Core,Simple Injector,Ef Core 2.2,我正在尝试在我的.NETCore项目中使用SimpleInjector作为我的DI来实现EFCore缓存。我使用的是CQRS模式,所以我有一大堆查询要缓存(不是全部) 我已经为缓存查询创建了一个通用接口,它接受查询的返回类型和查询参数: public interface ICachedQuery<T, P> { T Execute(P args); string CacheStringKey { get; set; } } 我将我的GetAssetsForUser

我正在尝试在我的.NETCore项目中使用SimpleInjector作为我的DI来实现EFCore缓存。我使用的是CQRS模式,所以我有一大堆查询要缓存(不是全部)

我已经为缓存查询创建了一个通用接口,它接受查询的返回类型和查询参数:

public interface ICachedQuery<T, P>
{
    T Execute(P args);

    string CacheStringKey { get; set; }
}
我将我的
GetAssetsForUserQuery
注入如下:

Container.RegisterDecorator(typeof(ICachedQuery<,>), typeof(CachedCachedQueryDecorator<,>));

Container.Register<GetAssetsForUserQuery>();
readonly GetAssetsForUserQuery getAssetsForUserQuery;

        public GetTagsForUserQuery(GetAssetsForUserQuery getAssetsForUserQuery)
        {
            this.getAssetsForUserQuery = getAssetsForUserQuery;
        }
Container.Register(typeof(ICachedQuery<,>), typeof(GetAssetsForUserQuery));
但我的装潢师从未被击中!现在,如果我将查询注册到
Startup.cs
中的接口
ICachedQuery
,如下所示:

Container.RegisterDecorator(typeof(ICachedQuery<,>), typeof(CachedCachedQueryDecorator<,>));

Container.Register<GetAssetsForUserQuery>();
readonly GetAssetsForUserQuery getAssetsForUserQuery;

        public GetTagsForUserQuery(GetAssetsForUserQuery getAssetsForUserQuery)
        {
            this.getAssetsForUserQuery = getAssetsForUserQuery;
        }
Container.Register(typeof(ICachedQuery<,>), typeof(GetAssetsForUserQuery));
Container.Register(typeof(ICachedQuery),typeof(GetAssetsForUserQuery));
我插入了
ICachedQuery
,而不是
GetAssetsForUserQuery
,然后我的装饰器被命中。但是,
ICachedQuery
是一个泛型,所以我无法为一个特定的查询解析它

我知道我做错了什么,有什么帮助吗

但我的装潢师从未被击中

没错。要理解为什么会出现这种情况,最好将您希望构建的对象图可视化:

新建GetTagsForUserQuery(
新的CachedCachedQueryDecorator
但我的装潢师从未被击中

没错。要理解为什么会出现这种情况,最好将您希望构建的对象图可视化:

新建GetTagsForUserQuery(

新CachedCachedQueryDecoratorFinally Steven!我一整天都在等你回答我的问题!哈哈。谢谢你非常详细的回答。你能确认一下我的架构是如何实现缓存的吗?嗨@Viqas。这不是我能确认的。至少,你应该解决points在我的答案底部提到。最后,Steven!我已经等了你一整天了!哈哈。谢谢你非常详细的回答。你能确认一下我的架构是如何实现缓存的吗?Hi@Viqas。这不是我能确认的。至少,你应该添加请记住我答案底部提到的要点。