我可以在自定义中间件中添加新的作用域服务吗?

Can I add a new scoped service within a custom middleware?

我在 Asp .Net Core 中使用 WebApi,我想知道 if/how 我可以添加一个新的作用域服务,所有后续中间件和控制器都可以通过依赖注入访问吗?还是我应该与 HttpContext.Items 共享状态?这似乎不是它的目的,因为 HttpContext 在 WebApi 控制器中根本不可用?

如果 HttpContext 或 DI 都不是合适的工具,那么我如何在请求管道中传播状态而不从一开始就创建它?

首先在您的 ConfigureServices(IServiceCollection services) 中添加您的作用域服务

services.AddScoped<IMyService, MyService>();

然后,我知道将作用域服务注入中间件的唯一方法是将其注入中间件的 Invoke 方法

public class MyMiddleware
{
    private readonly RequestDelegate _next;

    public MyMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext httpContext, IMyService service)
    {
        service.DoSomething();
        await _next(httpContext);
    }
}

在 MyMiddleware 的构造函数中注入将使其默认成为单例,因为它仅在启动时调用。每次都会调用 Invoke,依赖注入会抓取作用域对象。