NinjectWebCommon 绑定不从子目录加载
NinjectWebCommon bindings not loading from subdirectories
我有一个 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 调用进行更改以使其包含子目录?显然,我可以自己遍历所有子目录并在每个子目录上调用绑定,但这对我来说似乎很混乱。
编辑:我应该补充一点,它对子文件夹中的所有插件做了一些奇怪的事情。它似乎将插件加载到它找到的第一个文件夹中,然后停止。
结语:我最终所做的是基于 Battery 的回答,但有点不同 - 我想我会分享。
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
包含找到所有要加载的 DLL 所需的 IO 访问...
我有一个 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 调用进行更改以使其包含子目录?显然,我可以自己遍历所有子目录并在每个子目录上调用绑定,但这对我来说似乎很混乱。
编辑:我应该补充一点,它对子文件夹中的所有插件做了一些奇怪的事情。它似乎将插件加载到它找到的第一个文件夹中,然后停止。
结语:我最终所做的是基于 Battery 的回答,但有点不同 - 我想我会分享。
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
包含找到所有要加载的 DLL 所需的 IO 访问...