Я пишу программу, которая использует 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; }
}
Все модули:
- Реализация интерфейса "IModule"
- Находится в подпапке "Modules"
- Совместное использование общего пространства имен
У меня недостаточно опыта работы с Windsor, чтобы знать, как перебирать контейнер или, если это возможно, и _container.ResolveAll ();похоже, не работает ... по крайней мере, так, как я это себе представляю.
Мои мысли приходят от этого примера , который намекает на передачу объекта, если объект ужесоздано. А это , что похоже.Я также видел некоторые интересные вещи в DictionaryAdapterFactory () , но не достаточно уверенно, чтобы знать, как его использовать
Возможно ли что-то подобное?Есть идеи?