Castle-Windsor: перезаписать компонент в будущем

У меня есть следующий вариант использования:

Я хочу зарегистрировать все компоненты, используемые всеми конфигурациями приложения. Затем я хотел бы зарегистрировать серию динамически настраиваемых «плагинов», которые выражаются в виде пользовательских реализаций IRegistration.

Только после этого я разрешаю точку запуска приложения.

Одна из вещей, которую я хотел бы, чтобы плагин делал, это перезаписывал реализацию службы. Что-то вроде этого:

public class SomePlugin {
  public void Register(IKernel kernel) {
    kernel.RemoveComponent(typeof(DefaultServiceImplementation).FullName);
    kernel.Register(
            Component.For<IService>()
              .ImplementedBy<AlternateServiceImplementation>())
  }
}

Однако это не работает, если какой-либо из уже зарегистрированных компонентов зависит от IService.

Я знаю, что могу сначала зарегистрировать плагины, но это ограничение по нескольким другим причинам. Как я могу выполнить мое конкретное требование?

Лучшее, что я мог придумать, это что-то вроде

kernel.ResolvingComponent += (model, a, b) => {
  if(model.Service == typeof(IService))
    model.Implementation = typeof(AlternateServiceImplementation);
}

Я думаю, что это может работать в некоторых ограниченных сценариях, но это далеко не идеально.


person George Mauer    schedule 04.03.2010    source источник
comment
так что в основном вы хотите, чтобы последний зарегистрированный компонент был компонентом по умолчанию?   -  person Mauricio Scheffer    schedule 04.03.2010
comment
Конечно, это будет одна реализация. В частности, мне интересно сказать: «Эй, для компонента X, который ранее был реализован X1, начните использовать X2 по умолчанию».   -  person George Mauer    schedule 04.03.2010
comment
Я имею в виду, что он всегда зарегистрирован последним? Или просто иногда? Не могли бы вы использовать атрибуты?   -  person Mauricio Scheffer    schedule 04.03.2010


Ответы (1)


Джордж,

Я считаю, что вы ищете IHandlerSelector. .

person Krzysztof Kozmic    schedule 04.03.2010