Я использую Castle Windsor в своей собственной реализации паттерна Resolver. У меня есть две реализации службы MethodAService и MethodBService, обе реализующие IMethodService. Я использую «Соглашение вместо конфигурации» при начальной загрузке Виндзора. Как я могу сказать Castle Windsor всегда использовать MethodAService в одном случае (отладка, выпуск и т. Д.), А в другом - MethodBService. Спасибо за уделенное время!
Конфигурация Castle Windsor на основе файла сборки или конфигурации
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
Как сделать так, чтобы это не зависело от IHandlerSelector?
- person Daniel A. White; 08.06.2009
Или в замке Виндзор, если на то пошло?
- person Daniel A. White; 08.06.2009
На самом деле мне сейчас это очень нравится. Я переделал его, чтобы использовать Generics вместо 3 typeof в вызове конструктора!
- person Daniel A. White; 08.06.2009