4

在我们的 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>();

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

PS这里是nuget config来查看程序集版本

  <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
4

1 回答 1

4

当创建一个StandardKernelifLoadExtensions属性是类的true(这是默认值)时,NinjectSettingsNinject 将扫描应用程序目录以从扩展加载模块dll

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

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

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

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

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

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

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

    所以它只nullType.FullName返回时才返回,这在极少数情况下null会发生。

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

  • 您可以使用融合日志检查加载的 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());
于 2013-11-09T11:26:39.247 回答