gpt4 book ai didi

.net - 不支持具有 null 或空名称的模块。忍者

转载 作者:行者123 更新时间:2023-12-01 01:04:46 25 4
gpt4 key购买 nike

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

最佳答案

创建 StandardKernel 时如果 LoadExtensions属性(property)是true (这是默认值)NinjectSettings类然后 Ninject 将扫描应用程序目录以从扩展 dll 加载模块.

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

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

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

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

这可能在两种情况下发生:
  • Ninject 加载了一个显式实现 INinjectModule 的模块。并返回 null作为源自 NinjectModule 的名称或模块但覆盖了默认 Name执行并返回 null
  • 或默认 Name NinjectModule 中的实现返回 null ... 然而这就是 source codeName看起来像:
    public virtual string Name
    {
    get { return GetType().FullName; }
    }

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

  • 因此,要解决您的问题,您需要找出哪个扩展/模块具有 Name空值:
  • 您可以使用 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());

    关于.net - 不支持具有 null 或空名称的模块。忍者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19765518/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com