模块名称为空或为null的模块不受支持。Ninject

4
在我们的MVC项目中,我们广泛使用Ninject。由于未知原因,StandardKernel开始抛出NotSupportedException异常,提示“不支持具有空名称的模块”。以下是代码:

        var _kernel = new StandardKernel(); // <-- this line throws exception
        _kernel.Bind<ISessionFactory>().ToMethod(x =>
            {
                 // some code...
            }).InSingletonScope();
        _kernel.Bind<IAppDomainSetup>().To<AppDomainSetup>();

有人知道可能出了什么问题吗?谢谢。

附上nuget配置以查看程序集版本。

  <package id="Ninject" version="3.0.1.10" targetFramework="net45" />  
  <package id="Ninject.MVC3" version="3.0.0.6" targetFramework="net45" />   
  <package id="Ninject.Web.Common" version="3.0.0.7" targetFramework="net45" />

这里是堆栈跟踪信息

  at Ninject.KernelBase.Load(IEnumerable`1 m) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:line 207
   at Ninject.KernelBase.Load(IEnumerable`1 assemblies) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:line 245
   at Ninject.Modules.CompiledModuleLoaderPlugin.LoadModules(IEnumerable`1 filenames) in c:\Projects\Ninject\ninject\src\Ninject\Modules\CompiledModuleLoaderPlugin.cs:line 82
   at Ninject.Modules.ModuleLoader.LoadModules(IEnumerable`1 patterns) in c:\Projects\Ninject\ninject\src\Ninject\Modules\ModuleLoader.cs:line 60
   at Ninject.KernelBase.Load(IEnumerable`1 filePatterns) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:line 236
   at Ninject.KernelBase..ctor(IComponentContainer components, INinjectSettings settings, INinjectModule[] modules) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:line 97
   at Ninject.KernelBase..ctor(INinjectModule[] modules) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:line 57
   at Ninject.StandardKernel..ctor(INinjectModule[] modules) in c:\Projects\Ninject\ninject\src\Ninject\StandardKernel.cs:line 46
   at TradeNet.Web.MvcApplication.CreateKernel() in c:\Users\dpopiashvili.DEA\Documents\Visual Studio 2010\Projects\TradeNet\TradeNet.Web\Global.asax.cs:line 65
   at Ninject.Web.Common.Bootstrapper.Initialize(Func`1 createKernelCallback) in c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\Bootstrapper.cs:line 50
   at Ninject.Web.Common.NinjectHttpApplication.Application_Start() in c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\NinjectHttpApplication.cs:line 80

所以这意味着之前相同的代码可用?你有做了哪些更改?你有一些自定义的 NinjectModule 覆盖了 Name 属性吗? - nemesv
еҘҪзҡ„пјҢдҪҶдҪ иҝҳжІЎжңүеӣһзӯ”дҪ ж”№дәҶд»Җд№ҲйғЁеҲҶ...еҸҰеӨ–пјҢиҜ·жЈҖжҹҘдҪ зҡ„binж–Ү件еӨ№е№¶жҹҘжүҫж–Ү件пјҡ"Ninject.Extensions.*.dll"е’Ң"Ninject.Web.*.dll"гҖӮдҪ иғҪеҸ‘еёғз¬ҰеҗҲжӯӨж–№жЎҲзҡ„ж–Ү件еҲ—иЎЁеҗ—пјҹ - nemesv
感谢nemesv。我们没有改变内核创建部分,也没有将ninject或其库升级到新版本。它开始抛出这个异常的原因对我来说是一个谜。我检查了bin文件夹,里面有Ninject.dll、Ninject.Web.Mvc.dll和Ninject.Web.Common.dll。 - Davita
可能是 .net 版本变了?你最近安装了 VS2013 吗?这只发生在一台机器上还是多台机器都可以重现?你尝试过清理/重建解决方案吗?重新启动机器? - nemesv
我没有安装vs2013。这在多台机器上都发生了... :( - Davita
显示剩余4条评论
1个回答

4
创建一个StandardKernel时,如果NinjectSettings类的LoadExtensions属性为true(默认值为true),则Ninject将扫描应用程序目录以从扩展dll中加载模块。
默认情况下,它搜索以下模式:
"Ninject.Extensions.*.dll",
"Ninject.Web*.dll"

并加载从已发现的dll中找到的所有INinjectModule实现。

在您的情况下,自动模块加载过程会抛出异常,因为其中一个加载的模块的Name属性为null

这可能有两种情况:

  • Ninject loaded a module which explicitly implemented the INinjectModule and returned null as the name or a module which derived from NinjectModule but overridden the default Name implementation and returned null
  • Or the default Name implementation in the NinjectModule returned null... however this is how the source code of the Name look like:

    public virtual string Name
    {
         get { return GetType().FullName; }
    }
    

    so it only returns null if the Type.FullName returns null which can happen in very rare cases.

为了解决你的问题,你需要找出哪个插件/模块的Name为空:

  • you can check the loaded Ninject/Extension dlls with fusion log to make sure that you are loading the correct ones
  • you can try-catch the new StandardKernel() and log out the loaded modules with

     try
     {
         _kernel = new StandardKernel();
     }
     catch
     {
        var modules =
            AppDomain.CurrentDomain.GetAssemblies()
                .SelectMany(a => a.GetExportedTypes()
                .Where(t => typeof(INinjectModule).IsAssignableFrom(t)))
                .ToArray();
     }
    

在找到导致问题的 INinjectModule 之前,您可以关闭自动扩展加载,并手动加载MvcModule

var _kernel = new StandardKernel(
     new NinjectSettings() { LoadExtensions = false }, new MvcModule());

非常好的答案。非常感谢。非常有帮助 :) - Davita

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接