CastleWindsor如何注册通用装饰器?我需要用相应的DeadlockRetryCommandHandlerDecorator类型装饰所有基于ICommandHandler类型的类型我试过这个解决方案,但不幸的是它不起作用。container.Register(Component.For(typeof(ICommandHandler)).ImplementedBy(typeof(DeadlockRetryCommandHandlerDecorator)));container.Register(AllTypes.FromThisAssembly().BasedOn(typeof(ICommandHandler)).WithService.Base());如何注册通用装饰器(DeadlockRetryCommandHandlerDecorator)来包装所有通用ICommandHandler实现?目前这不支持OOTB,因为Windsor总是偏爱特定于模式的组件而不是开放的泛型。您可以使用ISubDependencyResolver轻松地做到这一点。下面的代码假定您将装饰器的组件命名为“DeadlockRetryCommandHandlerDecorator”publicFooResolver(IKernelkernel){this.kernel=kernel;}publicboolCanResolve(CreationContextModelCompandlerRedependency,DependencyModeldependency){return(dependency.TargetType.IsGenericType&&dependency.TargetType.GetGenericTypeDefinition()==typeof(ICommandHandler))&&(model.Implementation.IsGenericType==false||model.Implementation.GetGenericTypeDefinition()!=typeof(DeadlockRetryCommandHandlerDecorator));}publicobjectResolve(CreationContextcontext,ISubDependencyResolvercontextHandlerResolver,ComponentModelmodel,DependencyModeldependency){returnkernel.Resolve("DeadlockRetryCommandHandlerDecorator",dependency.TargetItemTypeisimplementedusingthesamescenarioastheinterceptor,however)}}推荐方法。我遇到了同样的问题。我设法通过将每种类型显式注册为更具体的类型来解决这个问题。对我来说,这个解决方案比使用子依赖解析器更干净以上是C#学习教程:HowtoregisteragenericdecoratorwithCastleWindsor?如果分享的内容对你有用,需要进一步了解C#学习教程,希望你多多关注——varcommandTypes=businessAssembly.GetTypes().Where(t=>!t.IsInterface&&typeof(ICommand).IsAssignableFrom(t));foreach(varcommandTypeincommandTypes){varhandlerInterface=typeof(ICommandHandler).MakeGenericType(new[]{commandType});vartransactionalHandler=typeof(DeadlockRetryCommandHandlerDecorator).MakeGenericType(new[]{commandType});container.Register(Component.For(handlerInterface).ImplementedBy(transactionalHandler).LifeStyle.PerWebRequest);}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: