Конфигурация Castle Windsor на основе файла сборки или конфигурации

Я использую Castle Windsor в своей собственной реализации паттерна Resolver. У меня есть две реализации службы MethodAService и MethodBService, обе реализующие IMethodService. Я использую «Соглашение вместо конфигурации» при начальной загрузке Виндзора. Как я могу сказать Castle Windsor всегда использовать MethodAService в одном случае (отладка, выпуск и т. Д.), А в другом - MethodBService. Спасибо за уделенное время!


person Daniel A. White    schedule 07.06.2009    source источник
comment
В FAQ по Виндзору добавлен вопрос: using.castleproject.org/display/IoC/FAQ   -  person Mauricio Scheffer    schedule 24.01.2010


Ответы (1)


Вот один из способов сделать это с помощью IHandlerSelector:

public class DebugHandlerSelector: IHandlerSelector {
    private readonly Type serviceType;
    private readonly Type debugImplementation;
    private readonly Type releaseImplementation;

    public DebugHandlerSelector(Type serviceType, Type debugImplementation, Type releaseImplementation) {
        this.serviceType = serviceType;
        this.debugImplementation = debugImplementation;
        this.releaseImplementation = releaseImplementation;
    }

    public bool HasOpinionAbout(string key, Type service) {
        return service == serviceType;
    }

    public IHandler SelectHandler(string key, Type service, IHandler[] handlers) {
        return handlers.First(h => h.ComponentModel.Implementation == 
#if DEBUG
            debugImplementation
#else
            releaseImplementation
#endif                    
            );
    }
}

Пример использования:

container.Kernel.AddHandlerSelector(new DebugHandlerSelector(typeof(IMethodService), typeof(MethodAService), typeof(MethodBService)));
person Mauricio Scheffer    schedule 07.06.2009
comment
Как сделать так, чтобы это не зависело от IHandlerSelector? - person Daniel A. White; 08.06.2009
comment
Или в замке Виндзор, если на то пошло? - person Daniel A. White; 08.06.2009
comment
На самом деле мне сейчас это очень нравится. Я переделал его, чтобы использовать Generics вместо 3 typeof в вызове конструктора! - person Daniel A. White; 08.06.2009