在我的 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;
}
}
与本期类似:
当需要根据主机名选择数据库连接字符串时,我建议在应用程序启动时配置 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 进行交互以进行数据操作,其中可以管理基于主机名的数据库选择。