2 回答
TA贡献1820条经验 获得超9个赞
问题是由Web API处理解析控制器类型的隐式方式引起的;显式注册您的Web API控制器,您将看到问题出在哪里。
这是逐步进行的幕后工作:
和中的
System.Web.Http.DefaultHttpControllerActivator
调用SimpleInjectorWebApiDependencyResolver
要求创建API控制器。SimpleInjectorWebApiDependencyResolver
将该调用转发到SimpleInjector.Container
实例。Container
但是,该实例没有对该API控制器进行任何显式注册(因为您向解析器提供了一个空容器)。由于没有显式注册,因此容器尝试对此类型进行最后一刻的注册。
但是,该Controller类型取决于无法解析的接口,因为它们未在容器中注册(请记住,您的容器为空)。
尽管容器通常会引发异常,但是在这种情况下将返回null,因为通过该
IServiceProvider.GetService
方法请求了类型,并且该类型未明确注册。该
SimpleInjectorWebApiDependencyResolver
的GetService
方法将返回null
为好,因为它的定义,它应该返回null; 当不存在注册时(当前就是这种情况),它应该返回null。由于
DependencyResolver
返回的nullDefaultHttpControllerActivator
将返回其默认行为,这意味着将自己创建该类型,但这需要控制器具有默认构造函数。
简而言之,问题是由Web API处理解析控制器类型的隐式方式引起的。
因此,这里的解决方案是:
Container
您的Web应用程序中只有一个。这样可以避免各种麻烦和配置复杂化。在容器中显式注册所有Web API控制器。明确注册控制器将确保在无法解析控制器时,Simple Injector将引发异常。此外,这允许您调用
container.Verify()
,当配置无效(可验证的配置很重要)时,这将导致应用程序在启动过程中失败。而且,这还使您能够诊断配置,从而使您对配置的正确性更有信心。
我的建议是将MVC和Web API放在自己的项目中。这将使事情变得容易得多。
可以使用以下代码注册所有Web API控制器:
container.RegisterWebApiControllers(GlobalConfiguration.Configuration);
更新:
由于此错误非常普遍,因此在请求控制器类型时,SimpleInjectorWebApiDependencyResolver
该类的较新版本将永远不会返回null
。相反,它将引发一个描述性错误。因此,只要您使用Official,就永远不会再看到错误SimpleInjectorWebApiDependencyResolver
。
- 2 回答
- 0 关注
- 713 浏览
添加回答
举报