Windsorは常にオープンジェネリックよりもモード固有のコンポーネントを優先するため、現在これはOOTBではサポートされていません。
ただし、これは非常に簡単に機能させることができ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, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency)
{
return kernel.Resolve("DeadlockRetryCommandHandlerDecorator", dependency.TargetItemType);
}
}
ただし、Windsorでそのようなシナリオを実現するための推奨される方法は、インターセプターを使用することです。