我已经将Ninject与ASP.NET Web API一起使用了大约一个月,并且获得了很好的体验。但是,我有一个反复出现的问题,我还没有找到任何令人满意的解决方案。
如果将控件返回到ASP.NET解析器,Ninject在实例化依赖关系链中的任何对象时都会出现问题。当然,ASP.NET抱怨没有无参数构造函数。
有没有办法从Ninject获取有关潜在故障的信息,甚至是无法创建的对象。
我想我可能有办法记录内部行为,但无法找到任何信息。
由于
答案 0 :(得分:1)
我对ASP.Net不太了解,但我对ninject了解了一两件事。 因此,如果我正确地收集了您的问题,那么只要ninject无法解析请求,控制权就会返回给框架,然后该框架会尝试实例化该类型 - 并且会失败,并指出要解决的类型缺失无参数构造函数。 这是不能令人满意的,因为很难找出哪个绑定不正确/失败。
为了收集更多信息,我建议您重写将解析请求传递给ninject的粘合代码。
而不是IResolutionRoot.TryGet<>
方法使用IResolutionRoot.TryGetAndThrowOnInvalidBinding<>()
方法。如果有绑定但是ninject无法解决它,此方法将抛出异常。 ninject&#39; s IResolutionRoot.TryGet<>
吞下了这些问题。
现在,如果没有显式绑定,ninject仍将返回null,ASp.Net框架可能仍会抛出一个异常,说明没有缺少无参数构造函数。我建议应该有关于它试图在异常上解决的类型的信息。如果不是这种情况,则更改ninject-glue-code以记录无法解析的所有请求。 然后,您应该为所有这些创建显式绑定,以便逐步缩小范围。
编辑:
如果您计划明确定义所有绑定/您已经这样做了,请转到IResolutionRoot.Get<>()
- 不要尝试。只要它无法解析类型,这将始终导致NinjectException。例外情况会告诉你更多关于它发生的原因。
另请参阅Are controller factories neccessary when using Ninject in ASP.NET mvc 4有关如何编写自己的胶水代码的信息。
答案 1 :(得分:0)
这是因为您没有在Ninject中明确注册MVC控制器。有关更多信息,请阅读this answer。虽然答案与Web API有关,但MVC在这方面表现相同。