我正在编写一个程序,在启动时使用IoC(Windsov3.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})
);存放处:
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; }
}所有模块:
我对温莎没有足够的经验,不知道如何迭代容器,如果可能的话,_container.ResolveAll();似乎不起作用.至少我脑子里有这样的想法。
我的想法来自这个例子,这意味着如果已经创建了对象,则传递对象。还有这个是相似的。我还在DictionaryAdapterFactory()上看到了一些有趣的东西,但我没有足够的自信去知道如何使用它。
这样的事有可能吗?有什么想法吗?
发布于 2012-03-19 21:31:20
与所有这些不同,您可以在全球范围内存储您的容器,并且可以在任何地方以完整的名称解析您的模块。
_container.Resolve<IModule>(serviceFullName)发布于 2012-03-20 06:52:49
可以向容器注册所有可用服务,然后创建仅返回数据库中启用的服务的提供程序。当然,您的组件应该只通过提供者访问这些服务。
https://stackoverflow.com/questions/9776445
复制相似问题