不能从子目录加载NinjectWebCommon绑定
本文关键字:NinjectWebCommon 绑定 加载 子目录 不能 | 更新日期: 2023-09-27 17:49:55
我有一个MVC项目,使用ninject从配置的文件夹加载插件。几个月来它一直工作得很好,但是项目需求发生了变化。插件现在需要放在单独的文件夹中,以便更容易地清理依赖库或其他文件。
此代码位于NinjectWebCommon:
private static void RegisterServices(IKernel kernel)
{
string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "plugins");
kernel.Bind(a => a.FromAssembliesInPath(path)
.SelectAllClasses()
.InheritedFrom<IPlugin>()
.BindToSelf()
.Configure(b => b.InRequestScope()));
}
我可以对Bind调用进行更改以使其包含子目录吗?显然,我可以自己遍历所有子目录并对每个子目录调用bind,但这对我来说似乎很混乱。
编辑:我应该补充一下,它对子文件夹内的所有插件都做了一些奇怪的事情。它似乎在它找到的第一个文件夹中加载插件,然后停止。
尾声:我最后做的是基于巴特里的答案,但有点不同——我想分享一下。
private static void RegisterServices(IKernel kernel)
{
string pluginDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "plugins");
IEnumerable<string> pluginAssemblies = Directory.EnumerateFiles(pluginDirectory, "*.dll", SearchOption.AllDirectories);
kernel.Bind(a => a.From(pluginAssemblies)
.SelectAllClasses()
.InheritedFrom<IPlugin>()
.BindToSelf()
.Configure(b => b.InRequestScope()));
}
不支持,ninject不支持搜索子目录
然而,也有更通用的重载,你可以很容易地使用:
kernel.Bind(x => x.From(IEnumerable<Assembly>));
和
kernel.Bind(x => x.From(IEnumerable<string>)); //assembly paths
所以没有必要这样做:
foreach(var assembly in GetAssemblies())
{
kernel.Bind(a => a.From(assembly))
.XYZ;
}
但是你宁愿这样做:
kernel.Bind(a => a.From(GetAssemblies())
.XYZ;
其中GetAssemblies
包含必要的IO访问以查找所有要加载的dll…