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

无法从根目录解析作用域服务'MyNameSpace. ITenantProvider' Provider

以下是中间件:

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>();
builder.Services.AddTransient<IDBService, DBService>();
app.UseMiddleware<TenantMiddleware>();

租户ITenantProvider的目标是设置一个租户ID(作为作用域),并在将其作为作用域注入到临时数据库服务时由其他服务使用.

public interface ITenantProvider
{
    public Guid GetTenantId();
    public void SetTenantId(Guid tenantId);
}

DBService将tenantId提供程序作为依赖项:

DbService(ITenantProvider tenant) { ... }

最重要的是方法DbLogic将能够经由方法GetTenantId()从注入的ITenantProvider获得与一次性调用的方法SetTenantId(Guid tenantId)相对应的tenantId,

DbLogic()
{
    Guid tenantId = _tenantProvider.GetTenantId();
}

我知道这个问题与试图将作用域服务(ITenantProvider)注入单例中间件有关,但我不确定如何正确地构造它以避免错误.

推荐答案

您可以在Invoke调用中从上下文中解析它(移除ctor参数):

public async Task Invoke(HttpContext context)
{
    var tenantProvider = context.RequestServices.GetRequiredService<ITenantProvider>();
    // Logic to set tenant ID
    await _next(context);
}

或者直接将其注入方法参数:

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

Csharp相关问答推荐

当MD5被废弃时,如何在Blazor WASM中使用它?

HttpContext. RequestAborted当Android APP失go 连接时未取消

使用客户端密钥为Fabric Rest API生成令牌

Azure Redis缓存与Entra ID身份验证

Blazor服务器端的身份验证角色

如何将不同类型的扩展参数的javascript函数转换成C#风格?

使用可信第三方的Iext8.Net pdf签名

在C#中反序列化/序列化具有混合元素顺序的XML时出现问题

Selify只更改第一个下拉菜单,然后忽略REST-C#

将内置的OrderedEumable&Quot;类设置为内部类有什么好处?

在C#中过滤Excel文件

在字符串C#之前获取数字

如何在.NET Maui中将事件与MVVM一起使用?

如何在mediatr命令中访问HttpContext而不安装弃用的nuget包

使用Blazor WebAssembly提高初始页面加载时间的性能

无法向Unity注册Microsoft Logger

在ObservableCollection上使用[NotifyPropertyChangedFor()]源代码生成器不会更新UI

C#中COM对象的实际地址

与Visual Studio 2022中的.NET框架相比,如何在.NET Core 6中获取错误输出的窗口句柄

C#:我需要根据换行符拆分字符串,而不是在字符串中用双引号分隔换行符