【问题标题】:Set default implementation in Castle Windsor 2.5 (for decorators)在 Castle Windsor 2.5 中设置默认实现(用于装饰器)
【发布时间】:2013-10-04 16:39:23
【问题描述】:

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

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

【问题讨论】:

    标签: castle-windsor decorator


    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-26
      • 1970-01-01
      • 1970-01-01
      • 2012-09-20
      • 1970-01-01
      • 2017-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多