仅在调用控制器操作时才知道数据库名称时注入DbContext
我有一个WebAPI / EF Core后端应用程序,有几个可能的客户端数据库连接到(每个相同的模式,但一次只有一个)。
在访问WebAPI控制器之前,不知道要连接到哪个数据库。 到那时,使用对starup.cs文件的ConfigureServices()方法中的services.AddDbContext ()的调用,将DBContext添加为可注入对象为时已晚。
由于每个请求都隔离了DbContext的每个实例,直接从控制器的操作实例化DbContext是否有任何问题,而不是通过使用DI传递它?
您可以/应该使用抽象工厂来创建DbContext
public interface IDbContextFactory { ApplicationContext Create(); } public class DbContextFactory() : IDbContextFactory, IDisposable { private ApplicationContext context; private bool disposing; public DbContextFactory(/* other dependencies here */) { } public ApplicationContext Create(string tenantId) { if(this.context==null) { // and the connection string and replace the database name in it // with the tenantId or whatever means you have to determine // which database to access string connectionString = ...; var dbContextBuilder = new DbContextOptionsBuilder(); dbContextBuilder.UseSqlServer(connectionString); this.context = new ApplicationContext(dbContextBuilder); } return this.context; } public void Dispose(){ Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing){ if (disposing){ disposing?.Dispose(); } } }
注册它
services.AddScoped();
并在控制器中使用它如下
public class MyController : Controller { private readonly IDbContextFactory contextFactory; public MyController(IMyContextFactory contextFactory) { this.contextFactory = contextFactory; } public Task GetSomeData(string tenantId) { var context = contextFactory.Create(tenantId); return Ok(await context.Data.Where(...).ToListAsync()); } }
- 使用Ocelot重新路由错误asp.net Core(7.0.4)
- ASPNET 5 MVC 6中的远程validation
- User.IsInRole在ASP.NET Core中没有返回任何内容(已实现存储库模式)
- ASP.Net Core MVC – 自定义属性的客户端validation
- .NET Core从appsettings.json获取连接字符串
- 为什么async / await在我的ASP.net 5控制台应用程序中不起作用?
- 交换Azure Web App部署槽会注销ASP.NET Core RC2中的所有用户
- ASP.NET核心中的dependency injection
- 根据操作名称授权用户