加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何使用Castle Windsor注册通用装饰器?

发布时间:2020-12-15 21:40:42 所属栏目:百科 来源:网络整理
导读:我需要根据ICOMmandHandler T进行装饰.使用相应的DeadlockRetryCommandHandlerDecorator T的类型类型 我试过这个解决方案,但遗憾的是它不起作用. container.Register( Component.For(typeof(ICommandHandler)) .ImplementedBy(typeof(DeadlockRetryCommandHa
我需要根据ICOMmandHandler< T>进行装饰.使用相应的DeadlockRetryCommandHandlerDecorator< T>的类型类型

我试过这个解决方案,但遗憾的是它不起作用.

container.Register(
    Component.For(typeof(ICommandHandler<>))
    .ImplementedBy(typeof(DeadlockRetryCommandHandlerDecorator<>)));

container.Register(
    AllTypes.FromThisAssembly()
        .BasedOn(typeof(ICommandHandler<>))
        .WithService.Base());

如何注册通用装饰器(DeadlockRetryCommandHandlerDecorator< T>)来包装所有通用ICommandHandler< T>实现?

解决方法

目前这不支持OOTB,因为Windsor总是倾向于特定于模式的组件而不是开放式泛型.

但是,使用ISubDependencyResolver可以很容易地实现这一点.下面的代码假设您为装饰器“DeadlockRetryCommandHandlerDecorator”命名组件

public class CommandHandlerResolver : ISubDependencyResolver
{
    private readonly IKernel kernel;

    public FooResolver(IKernel kernel)
    {
        this.kernel = kernel;
    }

    public bool CanResolve(CreationContext context,ISubDependencyResolver contextHandlerResolver,ComponentModel model,DependencyModel dependency)
    {
        return (dependency.TargetType.IsGenericType &&
                dependency.TargetType.GetGenericTypeDefinition() == typeof (ICommandHandler<>)) &&
                (model.Implementation.IsGenericType == false ||
                model.Implementation.GetGenericTypeDefinition() != typeof (DeadlockRetryCommandHandlerDecorator<>));
    }

    public object Resolve(CreationContext context,DependencyModel dependency)
    {
        return kernel.Resolve("DeadlockRetryCommandHandlerDecorator",dependency.TargetItemType);
    }
}

然而,使用拦截器来实现与Windsor一样的场景的推荐方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读