参数名称:root 不能为 Null 异常 Ninject
Parameter name: root cannot be Null exception Ninject
我在代码重构后收到来自 Ninject 的异常。因此我知道 是什么 导致了错误,但无法确定 为什么 。代码编译文件,但我从 Ninject:
收到运行时错误
Cannot be null
Parameter name: root
我正在尝试注入 class:
的常量实例
var subscriptionApiClientHelper = new SubscriptionApiClientHelper(AppSettings.Get<string>("AdminAPIUrl"),
AppSettings.Get<string>("APIV2Key"), Kernel.Get<ICache>());
kernel.Bind<SubscriptionApiClientHelper>().ToConstant(subscriptionApiClientHelper);
Ninject 在第一行抛出异常。
我的 class SubscriptionApiClientHelper 继承自另一个 class(在 Nuget 包中引用)因此:
public SubscriptionApiClientHelper(string baseUrl, string apiKey, ICache cache) : base(baseUrl, apiKey)
{
_cache = cache;
}
它的构造函数是这样的:
public SubscriptionApiClient(string baseUrl, string apiKey)
{
_baseUrl = baseUrl;
_apiKey = apiKey;
}
这个基础 class 中的几个方法被重写并实现了缓存,因此重写的原因是我不需要在基础 class 的所有方法上实现缓存。我从同一个 Nuget 包中注入了一些其他 classes,但没有问题,这些没有我怀疑导致问题的继承。请注意,我成功地注入并使用了基础 class 我也继承了 (SubscriptionApiClient),这只是导致问题的助手 class。
这是完整的堆栈跟踪:
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
有谁知道出了什么问题吗?
您的 Kernel
变量已分配给空引用。因为 Get
是一种扩展方法,所以您不会得到 NullReferenceException
,而是 ArgumentNullException
。我在 运行 这个测试时遇到了同样的异常:
StandardKernel kernel = null;
kernel.Get<ICache>();
这是因为我在尝试构建我想注入的 class 的实例时误用了 Ninject。我是这样解决的:
kernel.Bind<SubscriptionApiClientHelper>().To<SubscriptionApiClientHelper>()
.WithConstructorArgument("baseUrl", AppSettings.Get<string>("AdminAPIUrl"))
.WithConstructorArgument("apiKey", AppSettings.Get<string>("APIV2Key"))
.WithConstructorArgument("cache", kernel.Get<ICache>());
我现在可以成功注入 class。
我在代码重构后收到来自 Ninject 的异常。因此我知道 是什么 导致了错误,但无法确定 为什么 。代码编译文件,但我从 Ninject:
收到运行时错误Cannot be null Parameter name: root
我正在尝试注入 class:
的常量实例var subscriptionApiClientHelper = new SubscriptionApiClientHelper(AppSettings.Get<string>("AdminAPIUrl"),
AppSettings.Get<string>("APIV2Key"), Kernel.Get<ICache>());
kernel.Bind<SubscriptionApiClientHelper>().ToConstant(subscriptionApiClientHelper);
Ninject 在第一行抛出异常。
我的 class SubscriptionApiClientHelper 继承自另一个 class(在 Nuget 包中引用)因此:
public SubscriptionApiClientHelper(string baseUrl, string apiKey, ICache cache) : base(baseUrl, apiKey)
{
_cache = cache;
}
它的构造函数是这样的:
public SubscriptionApiClient(string baseUrl, string apiKey)
{
_baseUrl = baseUrl;
_apiKey = apiKey;
}
这个基础 class 中的几个方法被重写并实现了缓存,因此重写的原因是我不需要在基础 class 的所有方法上实现缓存。我从同一个 Nuget 包中注入了一些其他 classes,但没有问题,这些没有我怀疑导致问题的继承。请注意,我成功地注入并使用了基础 class 我也继承了 (SubscriptionApiClient),这只是导致问题的助手 class。
这是完整的堆栈跟踪:
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
有谁知道出了什么问题吗?
您的 Kernel
变量已分配给空引用。因为 Get
是一种扩展方法,所以您不会得到 NullReferenceException
,而是 ArgumentNullException
。我在 运行 这个测试时遇到了同样的异常:
StandardKernel kernel = null;
kernel.Get<ICache>();
这是因为我在尝试构建我想注入的 class 的实例时误用了 Ninject。我是这样解决的:
kernel.Bind<SubscriptionApiClientHelper>().To<SubscriptionApiClientHelper>()
.WithConstructorArgument("baseUrl", AppSettings.Get<string>("AdminAPIUrl"))
.WithConstructorArgument("apiKey", AppSettings.Get<string>("APIV2Key"))
.WithConstructorArgument("cache", kernel.Get<ICache>());
我现在可以成功注入 class。