2014-03-20 1 views
2

Я пытаюсь построить архитектуру плагина для asp.net MVC, которая позволила бы контролировать Суперконтроллеры.В замке Виндзор, как я могу переопределить тип, зарегистрированный в FromThisAssembly()

На моем App_Start() У меня есть это:

ControllerBuilder.Current.SetControllerFactory(
    new WindsorControllerFactory(container)); 

И немного перед инсталлятором для всех контроллеров внутри Ассамблеи:

public class ControllersInstaller : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) { 
     container.Register(Classes.FromThisAssembly().BasedOn<IController>().LifestyleTransient()); 
    } 
} 

Это основано на Windsor Tutorial.

Теперь, на моем плагине или модуле, я хотел бы зарегистрировать новые контроллеры и иметь возможность переопределять определенные контроллеры, уже зарегистрированные в базовом приложении MVC.

Проблема заключается в том, что при использовании метода регистрации выше не существует способа вызова .Overridable() или .IsDefault(). Как я могу сделать что-то вроде этого:

public void Install(IWindsorContainer container, IConfigurationStore store) { 
      container.Register(Classes.FromThisAssembly(). 
      BasedOn<IController>(). 
      LifestyleTransient(). 
      IsDefault()); // This does not compile. 

В сущности, как переопределить что-то зарегистрированное по типу?

ответ

3

При использовании регистрации регистрации, например, Classes, вы не можете вызвать унитарные методы, например SetDefault; это не имеет смысла, поскольку вы возвращаете набор элементов, все из которых не могут быть стандартными. (Чтобы быть более точным, конвенция позволяет объявить описания компонентов, которые вас интересуют,. Тип, используемый представляет собой BasedOnDescriptor метод IsDefault существует на ComponentRegistration класс)

Однако можно вызвать метод Configure (и его вариации ConfigureIf и ConfigureFor), что позволяет вызывать унитарные методы для компонента. Таким образом, вы могли бы назвать IsDefault с помощью Configure метода

var regs = Classes 
      .FromThisAssembly() 
      .Pick() 
      .WithServiceAllInterfaces(); // dummy registration 
regs.Configure(c => c.IsDefault()); 

Конечно вам нужно будет определить, как определяется компонент по умолчанию. Например, если имя компонента по умолчанию содержит слово "default" вы можете использовать ConfigureIf метод:

regs.ConfigureIf(component => component.Name.ToLower().Contains("default"), 
          component => component.IsDefault()); 
0

В Виндзоре первая регистрация выигрывает, поэтому последующая регистрация службы не отменяет первоначальную регистрацию.

Итак, что вам нужно сделать, это выполнить ваши наиболее конкретные регистрации сначала, , затем сделать более общие, условные авто-регистрации.

См. Раздел «В Виндзоре сначала один выигрывает» на странице this.

+0

Но есть способ, чтобы переопределить это поведение? – tggm

+0

Можете ли вы объяснить немного больше о том, что будет в вашем плагине? Возможно, измените свой вопрос, чтобы показать весь жизненный цикл исходного состояния, а затем добавить плагины позже? –

+0

Плагин будет содержать контроллеры и представления, чтобы увеличить базовое приложение MVC. – tggm