ASP.NET CORE2.2在中间件内使用有作用域的服务

Posted gygg

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ASP.NET CORE2.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!

以上是关于ASP.NET CORE2.2在中间件内使用有作用域的服务的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core2.2 和2.1 版本中对cookie的设置和存储

使用中间件的全局异常处理在 ASP.Net Core 应用程序中不起作用

如何在 ASP.NET Core 2.2 中实现标识

ASP.NET Core 中间件详解及项目实战

ASP.NET Core 中间件详解及项目实战

ASP.NET Core 中间件详解及项目实战