Blazor .net 8 多租户 - 如何在类 ApplicationDbContext.OnConfiguring 中获取主机名(不在组件中)从 ASP.NET Core 3 转换

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

在我的 Blazor .net 8 项目中,我尝试在 ApplicationDbContext.OnConfiguring 类中获取主机名。我正在尝试重用我的一些 asp.net core 3 代码来处理多个数据库,但我找不到获取主机名的解决方案。

public class ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : IdentityDbContext<ApplicationUser>(options)
{
    private readonly AuthenticationStateProvider _authenticationStateProvider;//Should I used this?

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        string connectionString;
        var host = ??????//Need to get the host name
        if ( host=="mydomain1.com")
        {
            connectionString = "\"Data Source=Data\\\\database1.db\";";
        }
        if (host == "mydomain2.com")
        {
            connectionString = "\"Data Source=Data\\\\database2.db\";";
        }
        optionsBuilder.UseSqlite(connectionString);
    }

当前项目(Net Core)使用IHttpContextAccessor。在 blazor 中,不应使用 IHttpContextAccessor。

老项目 公共部分类ApplicationDbContext:IdentityDbContext

   {
    private readonly IHttpContextAccessor _accessor;

    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options, IHttpContextAccessor accessor)
        : base(options)
    {
        _accessor = accessor;
        Database.EnsureCreated();
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        string connectionString;
        var host = _accessor.HttpContext.Request.Host.Value;//Need to get the host name
        if ( host=="mydomain1.com")
        {
            connectionString = "\"Data Source=Data\\\\database1.db\";";
        }
        if (host == "mydomain2.com")
        {
            connectionString = "\"Data Source=Data\\\\database2.db\";";
        }
        var transactionApplicationTenant = TransactionApplicationTenantController.GetTransactionApplicationTenant(_accessor);
        optionsBuilder.UseSqLite(connectionString);
    }

作为示例 blazor 页面上的示例,我可以在组件中执行以下操作,但我需要在 ApplicationDbContext 中的 OnConfiguring 中执行此操作

@inject NavigationManager NavigationManager

@code {
protected override async Task OnInitializedAsync()
{

    var uri = new Uri(NavigationManager.Uri);
    string hostName = uri.Host;

}

}

与本期类似:

Blazor 服务器端具有基于主机名的多个数据库

blazor .net-8.0
1个回答
0
投票

当需要根据主机名选择数据库连接字符串时,我建议在应用程序启动时配置 DbContext 选项,而不是在 DbContext 本身内配置。这种方法允许您在实例化 ApplicationDbContext 之前注入必要的服务来确定连接字符串。

Blazor 服务器解决方案 在 Startup.cs 中启用 IHttpContextAccessor:

public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpContextAccessor();
    // Other service configurations...
}

使用工厂配置ApplicationDbContext:

将 IHttpContextAccessor 注入到创建 ApplicationDbContext 的工厂中,允许您根据请求的主机名选择连接字符串:

public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpContextAccessor();
    services.AddScoped<ApplicationDbContext>(provider =>
    {
        var accessor = provider.GetRequiredService<IHttpContextAccessor>();
        var host = accessor.HttpContext?.Request.Host.Host;
        string connectionString = DetermineConnectionString(host); // Implement this method based on your logic

        var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>();
        optionsBuilder.UseSqlite(connectionString);

        return new ApplicationDbContext(optionsBuilder.Options);
    });
}

Blazor WebAssembly 注意事项

对于 Blazor WebAssembly,由于其客户端性质,直接访问主机名来配置 DbContext 是不可行的。通常,Blazor WebAssembly 应用程序应与服务器端 API 进行交互以进行数据操作,其中可以管理基于主机名的数据库选择。

© www.soinside.com 2019 - 2024. All rights reserved.