栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

简单注入器无法注入Web API控制器中的依赖项

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

简单注入器无法注入Web API控制器中的依赖项

TLTR: 问题是由Web API处理解析控制器类型的隐式方式引起的;显式注册您的Web API控制器,您将看到问题出在哪里。

这是逐步进行的幕后工作:

  1. 和中的
    System.Web.Http.DefaultHttpControllerActivator
    调用
    SimpleInjectorWebApiDependencyResolver
    要求创建API控制器。
  2. SimpleInjectorWebApiDependencyResolver
    将该调用转发到
    SimpleInjector.Container
    实例。
  3. Container
    但是,该实例没有对该API控制器进行任何显式注册(因为您向解析器提供了一个空容器)。
  4. 由于没有显式注册,因此容器尝试对此类型进行最后一刻的注册。
  5. 但是,该Controller类型取决于无法解析的接口,因为它们未在容器中注册(请记住,您的容器为空)。
  6. 尽管容器通常会引发异常,但是在这种情况下将返回null,因为通过该
    IServiceProvider.GetService
    方法请求了类型,并且该类型未明确注册。
  7. SimpleInjectorWebApiDependencyResolver
    GetService
    方法将返回
    null
    为好,因为它的定义,它应该返回null; 当不存在注册时(当前就是这种情况),它应该返回null。
  8. 由于
    DependencyResolver
    返回的null
    DefaultHttpControllerActivator
    将返回其默认行为,这意味着将自己创建该类型,但这需要控制器具有默认构造函数。

简而言之,问题是由Web API处理解析控制器类型的隐式方式引起的。

因此,这里的解决方案是:

  1. Container
    您的Web应用程序中只有一个。这样可以避免各种麻烦和配置复杂化。
  2. 在容器中显式注册所有Web API控制器。明确注册控制器将确保在无法解析控制器时,Simple Injector将引发异常。此外,这允许您调用
    container.Verify()
    ,当配置无效(可验证的配置很重要)时,这将导致应用程序在启动过程中失败。而且,这还使您能够诊断配置,从而使您对配置的正确性更有信心。

我的建议是将MVC和Web API放在自己的项目中。这将使事情变得容易得多。

可以使用以下代码注册所有Web API控制器:

container.RegisterWebApiControllers(GlobalConfiguration.Configuration);

更新:

由于此错误非常普遍,因此在请求控制器类型时,

SimpleInjectorWebApiDependencyResolver
该类的较新版本将
永远不会
返回
null
。相反,它将引发一个描述性错误。因此,只要您使用Official,就永远不会再看到错误
SimpleInjectorWebApiDependencyResolver



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/576000.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号