Управляемый данными IoC - PullRequest
0 голосов
/ 19 марта 2012

Я пишу программу, которая использует IoC (Windsor v3.0) при запуске, чтобы загрузить все сборки в каталоге, если реализует интерфейс / службу, в хранилище для ядра приложения.Я, однако, новичок в Виндзоре.Мое приложение опрашивает таблицу БД и, когда оно находит строку, которую необходимо обработать, оно проверяет имя службы для обработки записи и запрашивает ее из хранилища.Я могу загрузить все модули в словарь, а затем в хранилище через конфигурацию, как в этом посте .Хорошо, но мне нужно чтобы оно было более динамичным.

Как я это себе представляю (псевдокод):

List<string> enabledServices = GetServicesFromDb();
IDictionary<string, IModule> dict = new IDictionary<string, IModule>();

//Load the assemblies (This works currently!)
_container.Register(AllTypes
                   .FromAssemblyInDirectory(new AssemblyFilter("Modules"))
                   .BasedOn<IModule>());

// Build dictionary
foreach(string service in enabledServices)
{
     foreach(?? asmble in _container.assemblies)
     {
         if(asmble.Id == service)
             dict.Add(service, asmble);
     }
}

// Register the repository from constructed dictionary
_container.Register(
    Component
    .For<IModuleRepository>()
    .ImplementedBy<IntegrationRepository>()
    .Parameters(new { modules = dict})
);

Хранилище:

public class IntegrationRepository : IModuleRepository
{
    private readonly IDictionary<string, IModule> _modules;

    public IntegrationRepository(IDictionary<string, IModule> modules)
    {
        _modules = modules;
    }

    public IModule GetModule(string moduleName)
    {
        return _modules.ContainsKey(moduleName) ? _modules[moduleName] : null;
    }
}

IModule выглядит следующим образом:

public interface IModule : IDisposable
{
    string Id { get; }
    string Description { get; }
    bool Enabled { get; set; }
    bool Validate();
    string EmailSubject { get; }
}

Все модули:

  1. Реализация интерфейса "IModule"
  2. Находится в подпапке "Modules"
  3. Совместное использование общего пространства имен

У меня недостаточно опыта работы с Windsor, чтобы знать, как перебирать контейнер или, если это возможно, и _container.ResolveAll ();похоже, не работает ... по крайней мере, так, как я это себе представляю.

Мои мысли приходят от этого примера , который намекает на передачу объекта, если объект ужесоздано. А это , что похоже.Я также видел некоторые интересные вещи в DictionaryAdapterFactory () , но не достаточно уверенно, чтобы знать, как его использовать

Возможно ли что-то подобное?Есть идеи?

Ответы [ 2 ]

0 голосов
/ 20 марта 2012

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

0 голосов
/ 20 марта 2012

вместо всего этого вы можете просто хранить свой контейнер в глобальном масштабе и разрешить полное имя для ваших модулей везде

_container.Resolve<IModule>(serviceFullName)
...