.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<,>))
)