Ninject - >扫描程序集以匹配接口并作为模块加载

时间:2014-05-13 10:05:13

标签: c# dependency-injection ninject

在Ninject.Extensions.Conventions的早期版本中,扫描目录以获取程序集,按接口过滤类,然后加载所有包含ninject模块的内容非常容易。

kernel.Scan(scanner =>
    scanner.FromAssembliesInPath(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location))
    scanner.AutoLoadModules();
    scanner.WhereTypeInheritsFrom<IPlugin>());

public class MyPlugin : NinjectModule, IPlugin {

     public override void Load() {
          Bind<IRepositoryFromPluginHost>().To<MyPluginImpl>().Named("special");
     }
}

然而,在我最近更新到最新版本后,一切似乎都消失了,我无法

  1. 自动加载模块
  2. 按接口过滤类型
  3. 有人有解决方案吗?

2 个答案:

答案 0 :(得分:4)

仍有https://github.com/ninject/ninject.extensions.conventions扩展名。 但是,界面已经改变,改为:

kernel.Bind(x =>
{
    x.FromAssembliesInPath("somepath")
     .IncludingNonePublicTypes()
     .SelectAllClasses()
     .InheritedFrom<IPlugin>()
     .BindDefaultInterface() // Binds the default interface to them;
});

更新: 如何使用约定扩展(如上所述)将所有IPlugin绑定到IPlugin,然后执行:

var plugins = IResolutionRoot.GetAll<IPlugin>();
kernel.Load(plugins);

答案 1 :(得分:1)

也许很难,但是这样的东西会得到一个从NinjectModule派生的类型列表。

var assemblies = AppDomain.CurrentDomain.GetAssemblies(); 
List<Type> types = new List<Type>();
foreach (var assembly in assemblies) 
{
    types.AddRange(GetModules(assembly)); 
}


    IEnumerable<Type> GetModules(Assembly assembly)
    {
         assembly.GetTypes()
              .Where(t => t.BaseType == typeof(NinjectModule));       
    }

要加载模块,请尝试此操作。

(Activator.CreateInstance(type)as NinjectModule).Load();