首页 > 解决方案 > “使用范围服务时,将服务注入 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.net-core

解决方案


这记录在 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);
}
}

推荐阅读