繁体   English   中英

参数名称:root不能为Null异常Ninject

[英]Parameter name: root cannot be Null exception Ninject

代码重构后,我从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

有人知道出什么事了吗?

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

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

这是由于我在尝试构造要注入的类的实例时滥用Ninject所致。 我这样解决了:

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

我现在可以成功注入该类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM