gpt4 book ai didi

asp.net-web-api - Web API 中的每个请求 DependencyResolver

转载 作者:行者123 更新时间:2023-12-02 02:54:58 25 4
gpt4 key购买 nike

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

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

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

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

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

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

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

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

最佳答案

要获取当前依赖范围,您必须使用当前 HttpRequestMessage 的(惊讶,惊讶:) GetDependencyScope() (有关更多信息,您可以阅读 on MSDN )而不是GlobalConfiguration

我不久前在博客中写过有关 Web API per-request dependency scope 的文章 - 这应该会有所帮助。

关于asp.net-web-api - Web API 中的每个请求 DependencyResolver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15026349/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com