2013-10-04 2 views
2

Я работаю с Castle Windsor 2.5 (обновление в настоящее время не является вариантом), и я пытаюсь зарегистрировать декораторы после регистрации оригинальных компонентов. Кажется, что в версии 3 замка вы можете использовать IsDefault для достижения этого. Есть ли аналогичная операция в замке 2.5 или какой-то другой способ достичь этого?Установите по умолчанию реализацию в Castle Windsor 2.5 (для декораторов)

Чтобы быть ясным, я не могу изменить порядок регистрации, чтобы сначала были зарегистрированы декораторы. Это платформа, в которой поведение платформы по умолчанию может быть изменено клиентами путем добавления или изменения существующих регистраций.

ответ

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); 
Смежные вопросы