Web API 中的每个请求 DependencyResolver

2024-03-07

在 MVC 中,一个ModelValidatorProvider被实例化并调用以验证每个请求的模型。这意味着在 DI 环境中,它可以依赖于单个请求范围内的对象,例如工作单元或数据库上下文。在 Web API 中,这似乎已经发生了重大变化。不是按请求实例化,ModelValidatorProvider似乎是长期存在的,并在应用程序启动时实例化。然后 WebAPI 缓存结果ModelValidatorProvider每个类型,这意味着ModelValidator无法从 DI 获取任何依赖项。

我正在努力实施我的ModelValidator使用服务定位器来使用工厂(请不要自动添加“反模式”注释!)。这将允许我在每个请求中构造一个内部验证器对象,该对象能够从容器中获取依赖项。但是,我无法从此范围内获取范围为当前请求的依赖关系解析器或容器ModelValidator它本质上属于单例。我尝试过使用GlobalConfiguration.Configuration.DependencyResolver,但这仅返回全局范围的服务(从根范围,也这里提到 https://stackoverflow.com/a/11151148/163495)

我在 Autofac 工作,因此特定于 autofac 的解决方案将是合适的(例如 MVC 有AutofacDependencyResolver.Current,其内部使用DependencyResolver.GetService)。 WebAPI 集成中没有可用的等效项,大概是由于上述原因,全局DependencyResolver仅返回全球范围的服务。

我尝试这样做的原因(以及我自己的使用)是为了实现 FluentValidation 的 Web API 集成,而该集成目前还不存在。到目前为止,已经有两次尝试,但都没有处理依赖注入问题,而是产生了单个静态 ModelValidator。

到目前为止我尝试过的事情:

  • Using GlobalConfiguration.Configuration.DependencyResolver(从根范围返回对象)
  • 依赖于Func<IComponentContext>(始终返回根上下文)

在已被删除的答案中,建议删除IModelValidatorProvider来自 Web API 配置的服务。这必须使用反射来完成,因为接口和实现类都定义为内部的,但它确实使验证器工作得更好(因为 ModelValidator 是根据请求构造的)。但是,由于使用反射来检查模型及其具有的每个属性上的验证器,因此这样做会严重影响性能,因此我不想采用此选项。

Filip W 的回答建议使用 HttpRequestMessage 来获取依赖范围,但我没有找到诸如HttpRequestMessage.Current这将提供从一个长期存在的对象中访问该对象的机会 - 如果可以实现这一点,我相信一切都会就位。


要获取当前依赖范围,您必须使用 (惊喜,惊喜:)GetDependencyScope()当前的HttpRequestMessage(更多相关内容您可以阅读on MSDN http://msdn.microsoft.com/en-us/library/system.net.http.httprequestmessageextensions.getdependencyscope%28v=vs.108%29.aspx) 代替GlobalConfiguration.

我在博客上写过Web API 每个请求的依赖范围 http://www.strathweb.com/2012/11/asp-net-web-api-and-dependencies-in-request-scope/不久前 - 这应该会有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Web API 中的每个请求 DependencyResolver 的相关文章

随机推荐

  • 有什么办法可以让kafka流暂停一段时间然后再恢复吗?

    我们有一个要求 即使用 Kafka Streams 从 Kafka 主题读取数据 然后通过会话池通过网络发送数据 然而 有时 网络调用有点慢 我们需要经常暂停流 以确保网络不会过载 目前 我们将数据捕获到流中并将其加载到执行器服务 然后通过
  • 结构初始化和默认参数的不直观行为

    public struct Test public double Val public Test double val double NaN Val val public bool IsValid get return double IsN
  • 与 Webpack 捆绑时下划线出错

    我正在尝试重写使用 require js 的旧应用程序以使用 es6 导入 使用的库之一是 Backbone 和 Underscore 为了创建一个大包并将 es6 预编译为 es5 我使用 Webpack 和 babel loader 捆
  • 如何为主键列创建自定义自动生成的 ID 号?

    我创建了此表并插入了以下值 CREATE TABLE Product ID INTEGER IDENTITY 1 1 NOT NULL PRIMARY KEY CLUSTERED Product No AS RIGHT PDT0000 CA
  • EST 与 America/New_York 时区之间的差异

    有人可以告诉我 以下两个陈述有什么区别 TimeZone getTimeZone America New York and TimeZone getTimeZone EST 换句话说 为什么 EST 与 America New York 不
  • 使用 graph api 获取用户所属的所有租户

    我有一个应用程序 它使用 AUTH v2 身份验证提供程序和公共租户 login microsoftonline com common v2 0 进行身份验证 现在 由于我的用户可以属于任何 AAD 租户 并且我希望我的用户能够选择他们正在
  • 在 UNIX 中比较两个文件

    我想比较两个文件 未排序 文件 1 和文件 2 我想执行 file2 file1 差异 而不管行号如何 差异不工作 我通过使用 comm 得到了解决方案 comm 23 file1 file2 会给你想要的输出 无论如何 首先需要对文件进行
  • Javascript将对象推送到全局数组会覆盖以前的值吗?

    我在 Javascript 中遇到这个问题 我想从对象数组中获取经度和纬度值 这一切都工作正常 但是当我尝试将其保存到全局数组中时 它会覆盖以前的每个值 结果是一个数组 其中包含最后推送的对象的 8 倍 全局数组 var coordinat
  • IIS Express (WebMatrix) 对外部连接开放

    我已经在端口 80 和 2012 上启用了 IIS Express HTTP 流量输入 和 IIS Express HTTPS 流量输入 的防火墙规则 此端口用于 WebMatrix 但我无法从 LAN 连接到服务器 WebMatrix 在
  • 如何在 weblogic 10.3 上的 MDB 中设置最大池大小

    我需要在 weblogic 10 3 上的 MDB 上设置最大池大小 我直接在MDB上插入这个注解 ActivationConfigProperty propertyName MaxPoolSize propertyValue 1 但它似乎
  • 使用 cronjob 运行 php 文件中的函数

    我的 php 文件 file1 php 中有一个函数 我正在尝试使用 cronjob 来调用此函数 我的 cron 作业命令是 php home name public html file1 php mail1 作为参考 函数代码如下 当直
  • 是否可以根据标准输入 git-diff 文件?

    假设我正在编辑一个文件 如果我保存文件 git diff会给我它相对于索引的变化 我想在不先保存文件的情况下获取相对于索引的更改 以获得 实时 差异 一种解决方案是将未保存的更改写入临时文件 即将文件保存在其他地方 将暂存文件写入另一个临时
  • OS X 10.10.2 与“__mpf_struct”相关的未定义符号错误

    我正在尝试编译一个程序 https github com davidsd sdpb https github com davidsd sdpb 在 OS X 10 10 2 上使用 gcc 4 9 boost 1 57 0 gmp 6 0
  • Code::Blocks:CMake 生成的 Makefile 表示“无需执行任何操作”。

    我刚刚在我的 Win7 64 Box 上安装了带有 MinGW 的 Code Blocks 并尝试编译 CMake 生成的项目 即 openclonk Clean all in clonk Cleaned clonk all Build a
  • 如何获取执行的.jar文件的路径?

    在 Java 中如何获取已执行的 jar 文件的路径 我尝试使用System getProperty user dir 但这只给了我当前的工作目录 这是错误的 我需要 jar 文件直接位于的目录路径 而不是 pwd 您能具体说明为什么需要该
  • 一种用于膨胀/收缩(偏移、缓冲)多边形的算法

    我如何 膨胀 多边形 也就是说 我想做类似的事情 要求是新 膨胀 多边形的边 点与旧 原始 多边形的边 点都处于相同的恒定距离 在示例图片上它们不是 因为那时它必须使用弧来膨胀顶点 但是让我们暂时忘记这一点 我正在寻找的数学术语实际上是向内
  • Vue cli 3 在构建后执行一些任务

    我在用vue cli 3这是我的vue config js const path require path const webpack require webpack const publicDir public const isProdu
  • Three.js 中“THREE.OrbitControls”中的相机位置发生变化

    The THREE OrbitControls当加载初始相机位置时工作正常 但是当使用按钮单击更改相机位置和相机旋转时 相机的位置发生变化 但是单击画布在新视图上旋转相机时 相机的位置突然发生变化 Camera Camera new THR
  • 将 SID 存储在变量中

    我需要一种方法将当前用户的 SID 存储在变量中 我尝试了很多变体 setlocal enableextensions for f tokens a in wmic path win32 useraccount where name Use
  • Web API 中的每个请求 DependencyResolver

    在 MVC 中 一个ModelValidatorProvider被实例化并调用以验证每个请求的模型 这意味着在 DI 环境中 它可以依赖于单个请求范围内的对象 例如工作单元或数据库上下文 在 Web API 中 这似乎已经发生了重大变化 不