【问题标题】:Parameter name: root cannot be Null exception Ninject参数名称:root 不能为 Null 异常 Ninject
【发布时间】:2018-02-23 15:24:26
【问题描述】:

在代码重构之后,我收到了来自 Ninject 的异常。因此我知道 是什么 导致了错误,但无法确定 为什么。代码编译文件,但我从 Ninject 收到运行时错误:

不能为空 参数名称:root

我正在尝试注入一个类的常量实例:

var subscriptionApiClientHelper = new SubscriptionApiClientHelper(AppSettings.Get<string>("AdminAPIUrl"),
            AppSettings.Get<string>("APIV2Key"), Kernel.Get<ICache>());

kernel.Bind<SubscriptionApiClientHelper>().ToConstant(subscriptionApiClientHelper);

Ninject 在第一行抛出异常。

我的 SubscriptionApiClientHelper 类继承自另一个类(在 Nuget 包中引用),因此:

public SubscriptionApiClientHelper(string baseUrl, string apiKey, ICache cache) : base(baseUrl, apiKey)
{
     _cache = cache;
}

其中的构造函数是这样的:

 public SubscriptionApiClient(string baseUrl, string apiKey)
 {
     _baseUrl = baseUrl;
     _apiKey = apiKey;
 }

这个基类中的几个方法被重写并实现了缓存,因此重写的原因是我不需要对基类的所有方法都实现缓存。我从同一个 Nuget 包中注入一些其他类没有问题,但这些没有我怀疑导致问题的继承。请注意,我成功地注入并使用了我继承的基类(SubscriptionApiClient),它只是导致问题的辅助类。

这是完整的堆栈跟踪:

at Ninject.ResolutionExtensions.GetResolutionIterator(IResolutionRoot root, Type service, Func`2 constraint, IEnumerable`1 parameters, Boolean isOptional, Boolean isUnique)
at Ninject.ResolutionExtensions.Get[T](IResolutionRoot root, IParameter[] parameters)
at AdminPortal.NinjectWebCommon.RegisterServices(IKernel kernel) in C:\Projects\AdminPortal\AdminPortal\App_Start\NinjectWebCommon.cs:line 106
at AdminPortal.NinjectWebCommon.CreateKernel() in C:\Projects\AdminPortal\AdminPortal\App_Start\NinjectWebCommon.cs:line 72
at Ninject.Web.Common.Bootstrapper.Initialize(Func`1 createKernelCallback)
at AdminPortal.NinjectWebCommon.Start() in C:\Projects\AdminPortal\AdminPortal\App_Start\NinjectWebCommon.cs:line 39

有人知道怎么回事吗?

【问题讨论】:

  • 你应该发布整个堆栈跟踪

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


【解决方案1】:

您的 Kernel 变量被分配给空引用。因为Get是一个扩展方法,所以你不会得到NullReferenceException,而是ArgumentNullException。运行此测试时,我遇到了同样的异常:

StandardKernel kernel = null;
kernel.Get<ICache>();

【讨论】:

  • 你是绝对正确的。谢谢。再往下大约 3 行,我再次使用内核,但没有问题: kernel.Bind().ToMethod(context => new StatsApiClient(AppSettings.Get("StatsApiUrl"), AppSettings.Get(" APIV2Key")、Kernel.Get()))。这是如何工作的?
  • 总之 kernel.bind 有效,但 kernel.get 无效。
【解决方案2】:

这归因于我在尝试构造我想要注入的类的实例时滥用 Ninject。我这样解决了:

kernel.Bind<SubscriptionApiClientHelper>().To<SubscriptionApiClientHelper>()
            .WithConstructorArgument("baseUrl", AppSettings.Get<string>("AdminAPIUrl"))
            .WithConstructorArgument("apiKey", AppSettings.Get<string>("APIV2Key"))
            .WithConstructorArgument("cache", kernel.Get<ICache>());

我现在可以成功注入这个类了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    相关资源
    最近更新 更多