用户针对主数据库进行身份验证。在auth之后,根据用户的不同,其余查询将从100多个相同架构数据库的列表中定位特定数据库。
在ASP .NET Core + EF Core中,如何注册我可以为后注入指定连接字符串的工厂或上下文(基于来自auth&d; dd用户提供的值)?
我正在使用IDbContextFactory<MyDbContext>
和其他一些选项,但我似乎无法找到在注入上下文后提供连接字符串或连接属性的任何明确示例。< / p>
答案 0 :(得分:2)
只需创建自己的工厂。
public interface ITentantDbContextFactory<T>
{
T Create(string tenantId);
}
public class AppTenantDbContextFactory : ITenantDbContextFactory<AppDbContext>
{
public AppDbContext Create(string tenantId)
{
// do some validations on tenantId to prevent users from
// injecting arbitrary strings into the connection string
var builder = new DbContextOptionsBuilder<AppDbContext>();
// you can also load it from an injected option class
builder.UseSqlServer($"Server=MYSERVERHERE;Database={tenantId};Trusted_Connection=True;");
return new AppDbContext(builder.Options);
}
}
然后将工厂注入您需要的地方。缺点是您必须管理DbContext的实时时间并进行处理。
您还可以在工厂中实现IDisposable
接口并保留参考列表并在调用Dispose()
方法时将其处理掉(如果您的工厂是工厂,则会在请求结束时执行此操作注册为瞬态或范围。
此外,如果您需要访问多个DbContext并使用tenantId
(或项目中调用的任何内容)作为Dictionary<string, AppDbContext>
中的键,那么工作单元模式也会非常有用,所以你调用factory.Create("tenantA")
时会得到相同的实例。然后添加SaveChanges
方法,该方法将调用所有实例化SaveChanges
实例的AppDbContext