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");
}
}
然而,在我最近更新到最新版本之后,一切似乎都消失了,我无法
- 自动加载模块
- 按接口过滤类型
有人有解决办法吗?
仍然有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();