C# Ninject->;扫描程序集以查找匹配的接口并作为模块加载

C# Ninject->;扫描程序集以查找匹配的接口并作为模块加载,c#,dependency-injection,ninject,C#,Dependency Injection,Ninject,在Ninject.Extensions.Conventions的早期版本中,扫描目录中的程序集、按接口筛选类,然后加载所有包含Ninject模块的内容非常容易 kernel.Scan(scanner => scanner.FromAssembliesInPath(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)) scanner.AutoLoadModules(); scanner.Whe

在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");
     }
}
kernel.Scan(扫描器=>
scanner.FromAssembliesInPath(Path.GetDirectoryName(Assembly.getExecutionGassembly().Location))
scanner.AutoLoadModules();
scanner.WhereTypeInheritsFrom());
公共类MyPlugin:NinjectModule,IPlugin{
公共覆盖无效负载(){
绑定()到()命名(“特殊”);
}
}
然而,在我最近更新到最新版本后,一切似乎都消失了,我无法继续

  • 自动加载模块
  • 按接口筛选类型
  • 有人对此有解决方案吗?

    还有扩展。 然而,界面已经改变,大致如下:

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

    也许很难,但类似这样的东西将为您提供一个从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));       
        }
    
    var assemblies=AppDomain.CurrentDomain.GetAssemblies();
    列表类型=新列表();
    foreach(程序集中的变量程序集)
    {
    AddRange(GetModules(assembly));
    }
    IEnumerable GetModule(程序集)
    {
    assembly.GetTypes()
    其中(t=>t.BaseType==typeof(ninject模块));
    }
    
    要加载模块,请尝试以下操作


    (Activator.CreateInstance(类型)作为NinjectModule.Load()

    是的,但这并不是我想要的。您的示例从特定路径中的程序集加载所有类,这些程序集继承自特定接口并绑定默认接口。但是,我想做的只是从程序集中加载Ninject模块作为插件,绑定指令就在其中。很抱歉,我搞错了。我将研究是否有办法实现这一目标。默认情况下,Ninject StandardKernel仍会自动加载以“Ninject.Extensions.”开头的程序集中的所有“IModule”,因此代码可能是可访问的。抱歉,我花了这么长时间。我更新了答案,以展示我们如何处理插件。如果你不希望额外的
    IPlugin
    绑定到处浮动,我会同意@Eric的答案。在ninject.extensions.conventions的v3.2.0.0中,应该是“IncludingNonePublicTypes()”而不是“IncludeNonPublicTypes()”@Xaniff:是的。虽然语法不正确,但我正确地引用了代码。这里没有我要编辑的东西。
    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));       
        }