Inversion of control 数据驱动的IoC

Inversion of control 数据驱动的IoC,inversion-of-control,castle-windsor,Inversion Of Control,Castle Windsor,我正在编写一个程序,在启动时使用IoCWindsor v3.0将目录中的所有程序集(如果实现接口/服务)加载到应用程序核心的存储库中。然而,我是温莎的新来者。我的应用程序轮询一个DB表,当它找到需要处理的行时,它会检查服务的名称以处理记录,并从存储库请求它。我可以将所有模块加载到字典中,然后通过中的配置加载到存储库中。很好,但我需要它更有活力 我是如何设想它的:伪代码: List<string> enabledServices = GetServicesFromDb(); IDict

我正在编写一个程序,在启动时使用IoCWindsor v3.0将目录中的所有程序集(如果实现接口/服务)加载到应用程序核心的存储库中。然而,我是温莎的新来者。我的应用程序轮询一个DB表,当它找到需要处理的行时,它会检查服务的名称以处理记录,并从存储库请求它。我可以将所有模块加载到字典中,然后通过中的配置加载到存储库中。很好,但我需要它更有活力

我是如何设想它的:伪代码:

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})
);
所有模块:

实现IModule接口 驻留在模块子文件夹中 共享一个公共名称空间 我对Windsor没有足够的经验,不知道如何遍历容器,或者如果可能的话,以及_container.ResolveAll;似乎不起作用。。。至少在我的脑海里是这样的

我的想法来源于暗示,如果对象已经被创建,则将对象传递进来。这是相似的。我在网上也看到了一些有趣的东西,但我没有足够的信心知道如何使用它


这样的事情可能吗?有什么想法吗?

代替所有这些,您只需全局存储您的容器,并且您可以在任何地方通过全名解析您的模块

_container.Resolve<IModule>(serviceFullName)

您可以将所有可用服务注册到容器中,然后创建一个仅返回数据库中已启用的服务的提供程序。当然,您的组件只能通过提供商访问这些服务。

这就是拥有存储库的目标:我的问题集中在如何首先流畅地将程序集放入存储库中。看起来我可能需要包装容器而不是字典。为什么要把事情弄复杂呢
public interface IModule : IDisposable
{
    string Id { get; }
    string Description { get; }
    bool Enabled { get; set; }
    bool Validate();
    string EmailSubject { get; }
}
_container.Resolve<IModule>(serviceFullName)