使用Ninject配置处理插件

时间:2013-12-17 17:18:56

标签: ninject

我正在编写一个应用程序,其中各种业务逻辑可以位于不同的程序集中,然后这些位用于构建期望两个接口的对象,如下所示:

public interface ISubjectSource {}
public interface IStudySource {}

public class Worker
{
   public Worker(ISubjectSource subjectSource, IStudySource studySource)
   {
     ....
   }
}

单独的程序集可以包含ISubjectSourceIStudySource的各种实现。然后是配置文件:

"Study1":{  
    "assemblies":["Compare.Sql.dll"],   
    "mappingSource":"Compare.Sql.SqlSubjectSource,Compare.Sql",
    "studySource":"Compare.Sql.SqlStudySource,Compare.Sql", 
}

其中描述了为“Study1”构建工作者所需的内容。当各种源都有自己的依赖关系时,我的问题就到了(例如,Sql Sources采用一个接口来处理连接字符串可能来自不同文件的连接)。

所以,我的问题归结为:我如何告诉Ninject当我为study1创建一个worker时,确保它获取这些对象,但是当我为Study2创建一个worker时,它会得到另一组对象? / p>

1 个答案:

答案 0 :(得分:0)

以下是我们的工作:

我们有一个接口IPlugin,带有标识符和可枚举的模块。

public interface IPlugin
{
  string Identification { get; }

  IEnumerable<Type> Modules { get; }
}

模块中的类型必须全部继承自NinjectModuleIdentification是您在配置中引用的内容,例如“我想使用插件SQLStudySource”或“我想使用插件FileStudySource”。

然后我们使用https://github.com/ninject/ninject.extensions.conventions绑定一组特定程序集中的所有IPlugin实现(如插件文件夹中的所有程序集):

this.Bind(x => x.FromAssembliesInPath("foo")
            .SelectAllClasses()
            .InheritedFrom<IPlugin>()
            .BindTo<IPlugin>());

接下来,根据配置激活插件(或者更确切地说是他们的模块):

IEnumerable<Type> activatedPluginModules = kernel
  .GetAll<IPlugin>()
  .Where(plugin => configuration.ActivatedPluginIdentifications.Contains(plugin.Identification)
  .SelectMany(x => x.Modules)
  .Distinct();

foreach(Type module in activatedPluginModules) 
{
  kernel.Load(module);
}

就是这样。