asp.net-core - “使用范围服务时,将服务注入 Invoke 或 InvokeAsync”是什么意思?
问题描述
我正在阅读.Net Core 中关于 DI 的 MS 文档。
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.2
我遇到了线
“警告
在中间件中使用范围服务时,将服务注入 Invoke 或 InvokeAsync 方法。不要通过构造函数注入进行注入,因为它会强制服务表现得像单例一样。”
任何人,请解释一下这是什么意思?
然后这里投票最多的答案之一是使用构造函数 DI 注入来进行范围服务。 AddTransient、AddScoped 和 AddSingleton 服务的区别?
解决方案
这记录在 ASP.NET Core Middleware: Per-request dependencies中。
因为中间件是在应用程序启动时构建的,而不是按请求构建的,所以中间件构造函数使用的作用域生命周期服务不会在每个请求期间与其他依赖注入类型共享。如果您必须在中间件和其他类型之间共享范围服务,请将这些服务添加到 Invoke 方法的签名中。Invoke 方法可以接受由 DI 填充的其他参数:
public class CustomMiddleware
{
private readonly RequestDelegate _next;
public CustomMiddleware(RequestDelegate next)
{
_next = next;
}
// IMyScopedService is injected into Invoke
public async Task Invoke(HttpContext httpContext, IMyScopedService svc)
{
svc.MyProperty = 1000;
await _next(httpContext);
}
}
推荐阅读
- json - 使用 json serde 在 hive 中加载 json 文件
- amazon-web-services - 最好扩展更少的大型实例还是更多的小型实例?
- ibm-mobilefirst - 问题 - 光标将焦点转移到基于 xcode 10.1 构建的 iOS 12 IPA 上的下一个文本框
- vb.net - 修改水晶报表中的参数值
- java - 如何从比屏幕大的视图的屏幕截图中创建位图?
- python - 为什么当我添加我用作参数的组时,由于 nonetype 没有属性而出现属性错误
- directus - 使用 git 升级 Directus 7 会导致使用时出错 - git pull origin
- .net - MVC5 应用程序在 IIS / Windows 2019 服务器上启动应用程序池时挂起
- angular - 在 kendo-daterange 上设置日期范围限制
- python-3.x - 如何将多个时间序列集输入 LSTM 模型进行预测?