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

And*_*ita 2 asp.net asp.net-web-api owin-middleware asp.net-core

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

如果HttpContext或DI都不是正确的工具,那么如何在不从头开始创建状态的情况下在请求管道中传播状态呢?

Mik*_*e H 5

首先在您的ConfigureServices(IServiceCollection服务)中添加范围服务

services.AddScoped<IMyService, MyService>();
Run Code Online (Sandbox Code Playgroud)

然后,我知道将范围服务注入到中间件中的唯一方法是将其注入到Middlware的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);
    }
}
Run Code Online (Sandbox Code Playgroud)

默认情况下,注入MyMiddleware的构造函数会使它成为单例,因为它仅在启动时被调用。每次都会调用Invoke,并且依赖项注入将获取作用域对象。