Внедрение зависимостей в реализации IWindsorInstaller - PullRequest
1 голос
/ 17 января 2012

У меня есть сценарий, в котором я хотел бы прочитать данные конфигурации для инверсии контейнера управления (Castle Windsor) из пользовательского хранилища данных. Это пользовательское хранилище данных имеет табличную структуру, которая перечисляет набор (потенциально заказных) компонентов, которые реализуют необходимые интерфейсы в системе.

Например, приложению требуется реализация IFoo, но фактическая сборка и тип, содержащие эту реализацию, определяются в этом пользовательском хранилище данных.

Я хотел бы иметь реализацию IWindsorInstaller, которая считывает структуру данных и регистрирует правильного разработчика IFoo. Однако для правильного доступа к моему пользовательскому хранилищу данных мне нужен доступ к фабричному классу (реализующему интерфейс IDataConnectionProvider). Этот тип зарегистрирован в контейнере, но я не знаю, разумно ли делать что-то вроде:

var container = new WindsorContainer();
container.Register(Component.For<IDataConnectionProvider>.
               ImplementedBy<DefaultDataConnectionProvider>.
               DependsOn(new { host, service });
container.Install(FromAssembly.This());

А потом есть класс в сборке:

public class PluginInstaller : IWindsorInstaller
{
   public void Install(IWindsorContainer container, IConfigurationStore store)
   {
     var dataStoreConnection = container.Resolve<IDataConnectionProvider>();
     // read table, register other services    
   }
}

Это лучший способ сделать то, что я пытаюсь сделать? Другие предложения?

Ответы [ 2 ]

0 голосов
/ 22 января 2012

Как правило, не рекомендуется разрешать что-либо до завершения процесса установки.

Вместо этого я бы не стал регистрировать IDataConnectionProvider в контейнере (если это не требуется для некоторых других компонентов), а просто передал бы его в конструктор вашего установщика:

container.Install(
   new PluginInstaller(new DefaultDataConnectionProvider(){Host = host},
   FromAssembly.This()
);

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

0 голосов
/ 17 января 2012

Да, наверное, я бы тоже так сделал. Параметр container в вашей программе установки плагинов есть именно по этой причине.

Вы также можете зарегистрировать host и service в контейнере и автоматически подключить к нему провайдера подключения к данным по умолчанию, т. Е. DependsOn.

не требуется.
...