您需要创建单个
DbContext.cs
类如下:
public class MyDatabase : DbContext, IMyDatabase
{
public MyDatabase(DbContextOptions<MyDatabase> options)
: base(options)
{
}
public DbSet<Post> Posts { get; set; } = default!;
}
在appsettings.json中指定两个连接字符串,如下所示:
{
"ConnectionStrings": {
"Company1": "Server=server1;Database=company1_db;User Id=user;Password=password;",
"Company2": "Server=server2;Database=company2_db;User Id=user;Password=password;"
}
}
之后,创建DBContextFactory.cs类,该类依赖于公司id,如下所示:
public class DbContextFactory
{
private readonly IConfiguration _configuration;
private readonly IServiceProvider _serviceProvider;
public DbContextFactory(IConfiguration configuration, IServiceProvider serviceProvider)
{
_configuration = configuration;
_serviceProvider = serviceProvider;
}
public MyDatabase CreateDbContext(int companyId)
{
var optionsBuilder = new DbContextOptionsBuilder<MyDatabase>();
var connectionString = GetConnectionString(companyId);
optionsBuilder.UseSqlServer(connectionString);
return new MyDatabase(optionsBuilder.Options);
}
private string GetConnectionString(int companyId)
{
return companyId switch
{
1 => _configuration.GetConnectionString("Company1"),
2 => _configuration.GetConnectionString("Company2"),
_ => throw new Exception("Invalid company ID")
};
}
}
别忘了注册
DbContextFactory.cs
在你的程序中上课。cs如下
builder.Services.AddSingleton<DbContextFactory>();
现在您可以修改
DatabaseStrategy.cs
类以动态获取
DbContext
通过如下方式传递公司ID:
public class DatabaseStrategy
{
private readonly DbContextFactory _dbContextFactory;
public DatabaseStrategy(DbContextFactory dbContextFactory)
{
_dbContextFactory = dbContextFactory;
}
public IMyDatabase GetDatabase(int companyId)
{
return _dbContextFactory.CreateDbContext(companyId);
}
}
最后,在控制器级别公开要传递的端点
List<Posts>
通过控制器
[ApiController]
[Route("[controller]")]
public class PostsController : ControllerBase
{
private readonly DatabaseStrategy _databaseStrategy;
public PostsController(DatabaseStrategy databaseStrategy)
{
_databaseStrategy = databaseStrategy;
}
[HttpGet]
public ActionResult<List<Post>> Get(int companyId)
{
var database = _databaseStrategy.GetDatabase(companyId);
var result = database.Posts.ToList();
return result;
}
}
注意:暴露你的
数据库策略.cs
直接在您的控制器中。因此,最好在
数据库策略.cs
以及您的API控制器。