如何修改中间件或其注册以正确使用范围服务?

问题描述 投票:0回答:1

我正在 .NET 中开发一个多租户应用程序,但遇到了一个问题,我需要从自定义中间件 TenantMiddleware 中访问范围服务 ITenantProvider。但是,当我尝试运行我的应用程序时,我收到以下错误:

无法从根解析范围服务“MyNameSpace.ITenantProvider” 提供商。

这是中间件:

public class TenantMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ITenantProvider _tenantProvider;

    public TenantMiddleware(ITenantProvider tenantProvider, RequestDelegate next)
    {
        _tenantProvider = tenantProvider;
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        // Logic to set tenant ID
        await _next(context);
    }
}

启动配置:

services.AddScoped<ITenantProvider, TenantProviderImplementation>();
app.UseMiddleware<TenantMiddleware>();

我知道这个问题与尝试将作用域服务(

ITenantProvider
)注入到单例中间件中有关,但我不确定如何正确构造它以避免错误。

c# .net dependency-injection middleware
1个回答
0
投票

可能最简单的方法是从

Invoke
调用中的上下文中解析它(删除 ctor 参数):

public async Task Invoke(HttpContext context)
{
    var tenantProvider = context.RequestServices.GetRequiredService<ITenantProvider>();
    // Logic to set tenant ID
    await _next(context);
}
© www.soinside.com 2019 - 2024. All rights reserved.