У меня есть сценарий, в котором я хотел бы прочитать данные конфигурации для инверсии контейнера управления (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
}
}
Это лучший способ сделать то, что я пытаюсь сделать? Другие предложения?