NinjectWebCommon绑定未从子目录

时间:2015-05-19 19:43:43

标签: c# ninject

我有一个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,但这对我来说似乎很麻烦。

编辑:我应该补充说,它对子文件夹中的所有插件都做了一些奇怪的事情。它似乎将插件加载到它找到的第一个文件夹中,然后停止。

EPILOGUE:我最终做的是基于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()));
}

1 个答案:

答案 0 :(得分:1)

不,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 ...