【问题标题】:Modules with null or empty names are not supported. Ninject不支持具有 null 或空名称的模块。忍者
【发布时间】:2013-11-04 10:12:53
【问题描述】:

在我们的 MVC 项目中,我们广泛使用 Ninject。由于未知原因,StandardKernel 开始抛出 NotSupportedException 并显示消息“不支持具有 null 或空名称的模块”。代码如下:

        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 属性?
  • 不,我没有,但我在我的项目中使用了 Ninject.Web.Common 库,我想它应该在内部使用一些模块......
  • 好的,但是你还没有回答你有什么改变的部分......另外请检查你的bin文件夹并查找文件:"Ninject.Extensions.*.dll"和"Ninject.Web.*.dll"。您能发布与此方案匹配的文件列表吗?
  • 感谢 nemesv。我们没有更改内核创建部分。我们也没有将 ninject 或其库升级到更新版本。它开始抛出这个异常的原因对我来说是一个谜。我检查了bin文件夹,里面有Ninject.dll、Ninject.Web.Mvc.dll和Ninject.Web.Common.dll
  • 也许.net 版本改变了?你最近安装了VS2013吗?它只发生在一台机器上还是你可以在多台机器上重现?您是否尝试过清理/重建解决方案?重启机器?

标签: .net asp.net-mvc dependency-injection ninject


【解决方案1】:

在创建StandardKernel 时,如果LoadExtensions 属性是NinjectSettings 类的true(这是默认值),那么Ninject 将扫描应用程序目录以从扩展dll 加载模块。

默认情况下,它会搜索以下模式:

"Ninject.Extensions.*.dll",
"Ninject.Web*.dll"

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

在您的情况下,此自动模块加载过程会引发异常,因为已加载模块的 Name 属性之一是 null。

这可能在两种情况下发生:

  • Ninject 加载了一个显式实现INinjectModule 的模块并返回null 作为名称或从NinjectModule 派生但覆盖默认Name 实现并返回null 的模块
  • 或者NinjectModule 中的默认Name 实现返回null...但是Name 的source code 是这样的:

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

    所以它只返回null 如果Type.FullName 返回null 这可能会发生in very rare cases.

因此,要解决您的问题,您需要找出哪个扩展/模块具有Name null:

  • 您可以使用fusion log 检查已加载的 Ninject/Extension dll,以确保您加载的是正确的
  • 您可以尝试捕获 new StandardKernel() 并使用

    注销已加载的模块
     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());

【讨论】:

  • 很好的答案。非常感谢你。非常有帮助:)
猜你喜欢
  • 1970-01-01
  • 2023-03-30
  • 2012-11-30
  • 1970-01-01
  • 2021-12-20
  • 2018-09-04
  • 2020-07-31
  • 1970-01-01
  • 2010-10-25
相关资源
最近更新 更多