• ASP.NET Core 2.2在中间件内使用有作用域的服务


    服务生存期

    为每个注册的服务选择适当的生存期。可以使用以下生存期配置ASP.NET Core服务:

    暂时

    暂时生存期服务 (AddTransient) 是每次从服务容器进行请求时创建的。 这种生存期适合轻量级、 无状态的服务。

    范围内

    作用域生存期服务 (AddScoped) 以每个客户端请求(连接)一次的方式创建。

    注意:在中间件内使用有作用域的服务时,请将该服务注入至 Invoke 或 InvokeAsync 方法。 请不要通过构造函数注入进行注入,因为它会强制服务的行为与单一实例类似。

    单例

    单一实例生存期服务 (AddSingleton) 是在第一次请求时(或者在运行 Startup.ConfigureServices 并且使用服务注册指定实例时)创建的。 每个后续请求都使用相同的实例。 如果应用需要单一实例行为,建议允许服务容器管理服务的生存期。 不要实现单一实例设计模式并提供用户代码来管理对象在类中的生存期。

    注意:从单一实例解析有作用域的服务很危险。 当处理后续请求时,它可能会导致服务处于不正确的状态。

    本篇博客主要介绍在中间件内使用有作用域的服务时遇到的错误

    博主在使用JWT实现Token身份认证时自定义了中间件 TokenProviderMiddleware

    在 TokenProviderMiddleware 的构造方法中注入自定义的接口 IUserDAL 之后运行报错:

    提示:无法从根提供程序解析“dal.iuserdal”,因为它需要范围服务“dal.MyDataContext”。

    MyDataContext 为定义的数据库上下文类,默认注入的是作用域生存期服务 (AddScoped)

    解决办法:将接口 IUserDAL 注入 Invoke 方法中即可

    End!

  • 相关阅读:
    在 IdentityServer4 中创建客户端
    IdentityServer4 快速上手
    GraphQL Part IV: 浏览器内的 IDE
    GraphQL Part VII: 实现数据变更
    GraphQL Part VIII: 使用一对多查询
    GraphQL Part VI: 使用 Postgres 和 EF Core 持久化数据
    GraphQL Part V: 字段,参数和变量
    GraphQL Part III: 依赖注入
    GraphQL Part II: 中间件
    GraphQL Part I: hello, world.
  • 原文地址:https://www.cnblogs.com/gygg/p/11383258.html
Copyright © 2020-2023  润新知