注册在温莎通用装饰 [英] Registering generic decorators in Windsor

查看:154
本文介绍了注册在温莎通用装饰的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个看起来像这样的界面:

 公共接口IQueryHandler<在TQuery的,出TResult>
    其中,TQuery的:IQUERY< TResult>
{
    TResult处理(TQuery的查询);
}
 

我想换这个缓存装饰我所有的处理程序:

公共类CachingQueryHandler< TQuery的,TResult>     :IQueryHandler< TQuery的,TResult>     其中,TQuery的:IQUERY< TResult> {     公共CachingQueryHandler(         IQueryHandler< TQuery的,TResult>处理程序,         IQueryCachingRule< TQuery的,TResult> cachingRule,         ITaggedCacheProvider缓存)     {         // ...     }     // ... }

,这是我如何温莎注册组件:

  container.Register(
    零件
        。对于(typeof运算(IQueryHandler<,>))
        .ImplementedBy(typeof运算(CachingQueryHandler<,>)),
    类
        .FromAssemblyContaining< GetUserCourseStatesHandler>()
        .BasedOn(typeof运算(IQueryHandler<,>))
        .WithServiceBase()
)
 

在几篇文章我读了温莎能自动连线装饰链,如果所有组件都登记在一个有效的订单。但是,在我的情况下温莎根本不理会我的 CachingQueryHandler 登记时,我试图解决任何的IQueryable<,> 。 在容器的名为潜在的错误配置组件私人领域,我发现这样的警告:

  

该组件的某些依赖未能静态解析。   IGSystems.Common.CQRS.CachingQueryHandler'2正在等待   以下依赖关系:    - 服务IQueryHandler'2指向回组件本身。依赖关系不能由组件自身来满足,没有你   忘记注册其他组件这项服务?

解决方案

那么,如果你希望你的缓存查询处理程序来装点你的真正实现,你可以重新安排你的注册。

  container.Register(
    类
        .FromAssemblyContaining< GetUserCourseStatesHandler>()
        .BasedOn(typeof运算(IQueryHandler<,>))
        .WithServiceBase(),
零件
        。对于(typeof运算(IQueryHandler<,>))
        .ImplementedBy(typeof运算(CachingQueryHandler<,>))
)
 

I have an interface that looks like this:

public interface IQueryHandler<in TQuery, out TResult>
    where TQuery : IQuery<TResult>
{
    TResult Handle(TQuery query);
}

I want to wrap all my handlers with this caching decorator:

public class CachingQueryHandler<TQuery, TResult>
    : IQueryHandler<TQuery, TResult>
    where TQuery : IQuery<TResult>
{
    public CachingQueryHandler(
        IQueryHandler<TQuery, TResult> handler,
        IQueryCachingRule<TQuery, TResult> cachingRule,
        ITaggedCacheProvider cache)
    {
        //...
    }

    //...
}

Thats how I registering components in Windsor:

container.Register(
    Component
        .For(typeof(IQueryHandler<,>))
        .ImplementedBy(typeof(CachingQueryHandler<,>)),
    Classes
        .FromAssemblyContaining<GetUserCourseStatesHandler>()
        .BasedOn(typeof(IQueryHandler<,>))
        .WithServiceBase()
)

In few articles I read that Windsor can wire a decorator chain automatically, if all components are registered in a valid order. But in my case Windsor just ignores my CachingQueryHandler registration when I trying to resolve any IQueryable<,>. In container's private field named Potentially Misconfigured Components I found this warning:

Some dependencies of this component could not be statically resolved. IGSystems.Common.CQRS.CachingQueryHandler'2 is waiting for the following dependencies: - Service 'IQueryHandler'2' which points back to the component itself. A dependency cannot be satisfied by the component itself, did you forget to register other components for this service?

解决方案

Well if you want your caching query handler to decorate your real implementation, you should reorder your registrations.

container.Register(
    Classes
        .FromAssemblyContaining<GetUserCourseStatesHandler>()
        .BasedOn(typeof(IQueryHandler<,>))
        .WithServiceBase(),
Component
        .For(typeof(IQueryHandler<,>))
        .ImplementedBy(typeof(CachingQueryHandler<,>))
)

这篇关于注册在温莎通用装饰的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆