我正在使用 Castle Windsor 2.5(升级目前不是一个选项),并且正在注册原始组件后尝试注册装饰器。似乎在城堡版本 3 中,您可以使用 IsDefault 来实现这一点。城堡 2.5 中是否有类似的操作或其他方式来实现这一目标?
为了清楚起见,我无法更改注册顺序以便首先注册装饰器。这是一种平台架构,客户可以通过添加或更改现有注册来修改默认平台行为。
我正在使用 Castle Windsor 2.5(升级目前不是一个选项),并且正在注册原始组件后尝试注册装饰器。似乎在城堡版本 3 中,您可以使用 IsDefault 来实现这一点。城堡 2.5 中是否有类似的操作或其他方式来实现这一目标?
为了清楚起见,我无法更改注册顺序以便首先注册装饰器。这是一种平台架构,客户可以通过添加或更改现有注册来修改默认平台行为。
看起来 IHandlerSelector 可以解决问题:
public class DecoratorHandler : IHandlerSelector
{
private readonly IWindsorContainer _container;
private readonly HashSet<Type> _decoratedTypes = new HashSet<Type>();
public DecoratorHandler(IWindsorContainer container)
{
_container = container;
}
public bool HasOpinionAbout(string key, Type service)
{
return _decoratedTypes.Contains(service);
}
public IHandler SelectHandler(string key, Type service, IHandler[] handlers)
{
return handlers[handlers.Length - 1];
}
public void Register<TTarget, TDecorator>() where TDecorator : TTarget, IDecorator<TTarget>
{
_container.Register(Component.For<TTarget>().ImplementedBy<TDecorator>());
_decoratedTypes.Add(typeof(TTarget));
}
}
和
_decoratorHandler = new DecoratorHandler(_container);
_container.Kernel.AddHandlerSelector(_decoratorHandler);