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一样的场景的推荐方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |