2016-06-30 4 views
1

У нас есть куча контроллеров, которые мы регистрируем в Castle через запрос BasedOn. Один из этих контроллеров мы хотели бы добавить дополнительную зависимость конфигурации. Возможно, мы могли бы зарегистрировать этот параметр со всеми контроллерами. Следующий код - это то, как мы работали над проблемой, но я хотел бы знать, есть ли более элегантное/встроенное решение.Как добавить зависимость от существующей регистрации Castle Windsor?

public class ControllersInstaller : IWindsorInstaller 
{ 
    private readonly IAppConfig _appConfig = new AppConfig(); 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     container.Register(FindControllers().Configure(ConfigureComponentRegistration).LifestyleTransient()); 

     container.Register(Component.For<BarController>() 
      .LifestyleTransient() 
      .DependsOn(Dependency.OnValue("faxNumber", 
      _appConfig.GetAppSetting<string>("FaxNumber")))); 
    } 

    private void ConfigureComponentRegistration(ComponentRegistration obj) 
    { 
     obj.LifestyleTransient(); 
    } 

    private BasedOnDescriptor FindControllers() 
    { 
     return Classes.FromThisAssembly() 
      .BasedOn<IController>() 
      .If(Component.IsInSameNamespaceAs<FooController>(true)) 
      .If(t => t.Name.EndsWith("Controller") && t.Name != "BarController")     
      .LifestyleTransient(); 
    } 
} 
+0

В чем вы заботитесь об этом решении? –

+0

Не стоит беспокоиться об одном экземпляре, но, если я получу больше, мне не нравятся дополнительные условия регистрации. Я решил, что есть способ переопределить существующие регистрации или расширить их, но не смог найти хороший способ. –

ответ

2

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

t.Name != "BarController" 

Проверьте мой ответ здесь, за то, как переопределить существующие компоненты: https://stackoverflow.com/a/37832194/644891

+0

Это в значительной степени то, что я искал, и не смог найти ответ из-за шума на условиях google. Спасибо! –

0

Вы полностью можете, просто use ConfigureFor<> method.

container.Register(FindAllControllers() 
    .ConfigureFor<BarController>(x => 
     x.DependsOn(Dependency.OnAppSettingsValue("faxNumber")) 
    ) 
); 

Как я отмечаю, я не уверен, почему ваш пример указывает продолжительность жизни три раза. Достаточно сделать это один раз.