gpt4 book ai didi

c# - .NET 核心 DbContext 动态连接字符串

转载 作者:太空狗 更新时间:2023-10-29 22:29:56 26 4
gpt4 key购买 nike

我正在尝试根据每个 http 请求 header 设置我的 DbContext 的连接字符串。在 .NET Core 中可以这样做吗?我在 MVC5 中完成了它,但我无法在 .NET 核心中实现它。

public void ConfigureServices(IServiceCollection services)
{
// ...
}

我不知道http header,那我在哪里可以做呢?

最佳答案

您应该能够像这样使用 DbContext 中的 HTTP 请求内容类型实例化:

using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;

public void ConfigureServices(IServiceCollection services)
{
// ...

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddScoped<HttpContext>(p => p.GetService<IHttpContextAccessor>()?.HttpContext);
services.AddDbContext<MyDbContext>();

var descriptor = new ServiceDescriptor(
typeof(DbContextOptions<MyDbContext>),
DbContextOptionsFactory,
ServiceLifetime.Scoped);

var descriptorNonGeneric = new ServiceDescriptor(
typeof(DbContextOptions),
typeof(DbContextOptions<MyDbContext>),
ServiceLifetime.Scoped);

services.Replace(descriptor);
services.Replace(descriptorNonGeneric);

// ...
}

private DbContextOptions<MyDbContext> DbContextOptionsFactory(IServiceProvider provider)
{
var httpContext = provider.GetService<HttpContext>();
// here we have the complete HttpContext
var myHeader = httpContext.Request.Headers["MyHeader"];
var connectionString = GetConnectionStringFromHeader(myHeader);

var optionsBuilder = new DbContextOptionsBuilder<MyDbContext>();
optionsBuilder.UseSqlServer(connectionString);

return optionsBuilder.Options;
}

因为 AddDbContext<TDbContext> EFCore 的扩展方法已经注册了一个 DbContextOptions作为单例,我们需要覆盖此注册并添加我们自己的 DbContextOption使用 HttpContext 的工厂方法并用 Scoped 执行生命周期。

这样我们可以在每次请求时更改选项(包括连接字符串)。

关于c# - .NET 核心 DbContext 动态连接字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44021605/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com