.net 在温莎注册普通装饰师

.net 在温莎注册普通装饰师,.net,dependency-injection,castle-windsor,ioc-container,decorator,.net,Dependency Injection,Castle Windsor,Ioc Container,Decorator,我有一个如下所示的界面: 公共接口处理程序 问:伊奎里在哪里 { TResult句柄(TQuery查询); } 我想用这个缓存装饰器包装我的所有处理程序: 公共类CachingQueryHandler :IQueryHandler 问:伊奎里在哪里 { 当众大笑( 伊奎尔汉德勒, 仙人掌仙人掌, ITAGEDCacheProvider缓存) { //... } //... } 这就是我在温莎注册组件的方式: container.Register( 组成部分 .For(类型(IQueryH

我有一个如下所示的界面:

公共接口处理程序
问:伊奎里在哪里
{
TResult句柄(TQuery查询);
}
我想用这个缓存装饰器包装我的所有处理程序:

公共类CachingQueryHandler
:IQueryHandler
问:伊奎里在哪里
{
当众大笑(
伊奎尔汉德勒,
仙人掌仙人掌,
ITAGEDCacheProvider缓存)
{
//...
}
//...
}
这就是我在温莎注册组件的方式:

container.Register(
组成部分
.For(类型(IQueryHandler))
.由(typeof(CachingQueryHandler))实现,
班级
.FromAssemblyContaining()
.BasedOn(类型(IQueryHandler))
.WithServiceBase()
)
在几篇文章中,我读到温莎可以自动连接装饰链,如果所有组件都以有效顺序注册。但在我的例子中,当我试图解析任何
IQueryable
时,Windsor只是忽略了我的
CachingQueryHandler
注册。 在名为
的容器私有字段中,我发现了以下警告:

无法静态解析此组件的某些依赖项。 IGSystems.Common.CQRS.CachingQueryHandler'2正在等待 以下依赖项: -服务'IQueryHandler'2'指向组件本身。组件本身无法满足依赖关系,是吗 忘记为此服务注册其他组件


如果您希望缓存查询处理程序装饰您的实际实现,那么您应该重新排序您的注册

container.Register(
    Classes
        .FromAssemblyContaining<GetUserCourseStatesHandler>()
        .BasedOn(typeof(IQueryHandler<,>))
        .WithServiceBase(),
Component
        .For(typeof(IQueryHandler<,>))
        .ImplementedBy(typeof(CachingQueryHandler<,>))
)
container.Register(
班级
.FromAssemblyContaining()
.BasedOn(类型(IQueryHandler))
.WithServiceBase(),
组成部分
.For(类型(IQueryHandler))
.实施人(类型(CachingQueryHandler))
)

IQueryHandler
使用
in
out
关键字的原因是什么?这表明查询处理程序是可变的,这在我看来不太可能。您以(co/contra)变体的方式使用查询处理程序吗?不,是ReSharper建议使用该关键字。我接受它是为了压制警告,但我认为它不会产生不良后果。我说的对吗?。我不相信当你这样做的时候会发生非常糟糕的事情:-),但我认为它给出了一个建议,你的查询处理程序可以以不同的方式解决,这可能不是你想要的,也可能不容易用Castle Windsor实现。对于像
IEventHandler
这样的接口,更常见的情况是需要差异。例如,请参阅我关于它的问题,以及我关于如何使用Simple Injector的博客文章。顺便说一句,你看到了吗?我没有读过这篇文章,但我的解决方案与那里提出的完全相同。这让我很惊讶当你跟随固体,这就是你最终会得到的。所以你是可靠的:-)对不起,那不行。
container.Register(
    Component
        .For(typeof(IQueryHandler<,>))
        .ImplementedBy(typeof(CachingQueryHandler<,>)),
    Classes
        .FromAssemblyContaining<GetUserCourseStatesHandler>()
        .BasedOn(typeof(IQueryHandler<,>))
        .WithServiceBase()
)
container.Register(
    Classes
        .FromAssemblyContaining<GetUserCourseStatesHandler>()
        .BasedOn(typeof(IQueryHandler<,>))
        .WithServiceBase(),
Component
        .For(typeof(IQueryHandler<,>))
        .ImplementedBy(typeof(CachingQueryHandler<,>))
)