【问题标题】:How to inject a scoped service in a Swashbuckle example response?如何在 Swashbuckle 示例响应中注入范围服务?
【发布时间】:2021-06-06 08:36:09
【问题描述】:

我需要将 scoped 服务注入IOperationFilter,但 c-tor 无法使用:

class MyOperationFilter: IOperationFilter
{
   public MyOperationFilter(IMyService service) { }
}

会报错:

System.InvalidOperationException: '无法从根提供程序站点解析范围服务:

这是意料之中的,因为只有 transient 服务可以被注入,不是作用域服务

那么我怎样才能在IOperationFilter 中注入作用域服务?

文档或其他任何地方都没有示例。 我见过的示例使用瞬态非范围服务。 在 ASP.NET Core 中,通过将服务作为参数添加到 Invoke 方法,可以将范围服务注入到中间件中。但 Swashbuckle 似乎没有允许这样做的扩展。

查看源代码,我看不出 Swashbuckle 有办法做到这一点。

【问题讨论】:

  • 如何将 IServiceProvider 注入到 ctor 中,然后用它解析您的作用域服务?
  • @grinay 我已经提到,由于依赖注入在 ASP.NET Core 的中间件中的工作方式,它无法工作。我更新了问题,使其更加清晰。谢谢。

标签: asp.net-core swashbuckle swashbuckle.aspnetcore


【解决方案1】:

您可以使用两种方法:

  1. 如果我们正在谈论用户请求的范围服务,则注入 IHttpContextAccessor,然后请求范围服务进行请求。

_httpContextAccessor.HttpContext.RequestServices.GetRequiredService();

2.注入 IServiceProvider 并创建一个新的范围,然后请求您的范围服务,但它不会引用当前请求。

serviceProvider.CreateScope().ServiceProvider.GetService<MyScopedService>() 

【讨论】:

  • 我收到injection InvalidOperationException: A relational store has been configured without specifying either the DbConnection or connection string to use 我无法分享代码。
  • 这是关于错误配置的实体框架。尝试使用此错误进行搜索。或者分享你是如何为它设置连接字符串的。会尽力提供帮助。
  • 谢谢。我制作了一个示例应用程序,它可以与 IHttpConextAccessor 一起使用,谢谢。然而,在实际的应用程序中,自定义配置类的注入实例是空的(因此我之前的评论中的InvalidOperationException)。这是一个很大的应用程序,而 DI 让我们很难追踪一切究竟是如何运作的。我还没弄明白
  • 我认为问题是当options.OperationFilter&lt;MyFilter&gt;()被Swashbuckle调用时,该服务还没有注册......
猜你喜欢
  • 1970-01-01
  • 2017-03-20
  • 2016-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-02
  • 2020-08-05
  • 2020-03-02
相关资源
最近更新 更多