C# Ninject->;扫描程序集以查找匹配的接口并作为模块加载
在Ninject.Extensions.Conventions的早期版本中,扫描目录中的程序集、按接口筛选类,然后加载所有包含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
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));
}