Ninject→扫描程序集查找匹配的接口并作为模块加载

本文关键字:接口 加载 模块 扫描 程序集 查找 Ninject | 更新日期: 2023-09-27 18:02:58

在早期版本的Ninject.Extensions。按照惯例,扫描目录查找程序集,按接口过滤类,然后加载所有包含对象模块是相当容易的。

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. 按接口过滤类型

有人有解决办法吗?

Ninject→扫描程序集查找匹配的接口并作为模块加载

仍然有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);

可能是比较困难的方法,但是像这样的东西将为您提供一个派生自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();