我正在 .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
)注入到单例中间件中有关,但我不确定如何正确构造它以避免错误。
可能最简单的方法是从
Invoke
调用中的上下文中解析它(删除 ctor 参数):
public async Task Invoke(HttpContext context)
{
var tenantProvider = context.RequestServices.GetRequiredService<ITenantProvider>();
// Logic to set tenant ID
await _next(context);
}