在Castle Windsor 2.5中设置默认实现(用于装饰器)

时间:2013-10-04 16:39:24

标签: castle-windsor decorator

我正在使用Castle Windsor 2.5(升级目前不是一个选项),并且在原始组件注册后尝试注册装饰器。似乎在城堡版本3中你可以使用IsDefault来实现这一目标。在城堡2.5中是否有类似的操作或其他一些方法来实现这一目标?

为了清楚起见,我无法更改注册顺序,以便首先注册装饰器。这是一种平台架构,客户可以通过添加或更改现有注册来修改默认平台行为。

1 个答案:

答案 0 :(得分:1)

看起来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);