我在代码重构后收到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
有谁知道出了什么问题?
答案 0 :(得分:4)
您的Kernel
变量已分配给空引用。由于Get
是一种扩展方法,因此您不会获得NullReferenceException
,而是ArgumentNullException
。我在运行此测试时得到了相同的异常:
StandardKernel kernel = null;
kernel.Get<ICache>();
答案 1 :(得分:0)
这是由于我在尝试构建我想要注入的类的实例时滥用Ninject。我解决了这个问题:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test</title>
</head>
<body>
<div class="portfoliobox"></div>
</body>
</html>
我现在可以成功注入这个类。