首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据驱动IoC

数据驱动IoC
EN

Stack Overflow用户
提问于 2012-03-19 19:18:06
回答 2查看 102关注 0票数 0

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

我是如何想象它(伪代码)的:

代码语言:javascript
复制
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})
);

存放处:

代码语言:javascript
复制
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看起来是这样的:

代码语言:javascript
复制
public interface IModule : IDisposable
{
    string Id { get; }
    string Description { get; }
    bool Enabled { get; set; }
    bool Validate();
    string EmailSubject { get; }
}

所有模块:

  1. 实现"IModule“接口
  2. 驻留在“模块”子文件夹中
  3. 共享公共命名空间

我对温莎没有足够的经验,不知道如何迭代容器,如果可能的话,_container.ResolveAll();似乎不起作用.至少我脑子里有这样的想法。

我的想法来自这个例子,这意味着如果已经创建了对象,则传递对象。还有这个是相似的。我还在DictionaryAdapterFactory()上看到了一些有趣的东西,但我没有足够的自信去知道如何使用它。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-19 21:31:20

与所有这些不同,您可以在全球范围内存储您的容器,并且可以在任何地方以完整的名称解析您的模块。

代码语言:javascript
复制
_container.Resolve<IModule>(serviceFullName)
票数 0
EN

Stack Overflow用户

发布于 2012-03-20 06:52:49

可以向容器注册所有可用服务,然后创建仅返回数据库中启用的服务的提供程序。当然,您的组件应该只通过提供者访问这些服务。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9776445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档