现有如下系统:
1.用户登录后,有该系统所在的子数据库名称
2.每个用户可能不同子数据库
3.每个子数据库各个功能一直
问题:
再asp.net core 中如何根据用户登录信息,实例化各个用户的Db对象,即通过注入的方式,实例化每个用户的DbContext对象,在网上一大堆,都是无参构造函数实力注册,难道大家都没有这方面的需求嘛?
DbContext有带参构造函数,参数为连接字符串
你也可参考这个:https://docs.microsoft.com/zh-cn/ef/core/miscellaneous/configuring-dbcontext
我的这个参数,不是再配置文件内,是在登录用户的用户状态内,例如 A用户记录的数据库是a,那么依赖注入的时候,如何把 a 作为参数,实例化一个DbContext ,大佬?求指教
@E=mc²: 不同的数据库无非就是连接字符串和provider(提供程序)不同,依赖注入不就是根据连接字符串和provider进行构造的吗?我上面发的链接的代码里不是很清晰吗
大概的伪代码是这样子:
class userOptions
{
ctor(httpcontextaccess httpconext){};
public string userid=>httpcontext.request......;
}
DI.addsscope(useroptions);
class yourdbcontext:{
ctor(useroptions,dboptions<yourdbcontext>)
}
.net core 中间件的定义:
public static class ServiceCollectionExtensions
{
public static IServiceCollection Addxx(this IServiceCollection services, IConfiguration configuration)
{
//....
return services;
}
public static IServiceCollection AddXX(this IServiceCollection services, Action<XXOption> options)
{
//...
return services;
}
}
public class XXOption
{
public XXOption();
public int CacheAbsoluteExpirationRelativeToNow { get; set; }
public CacheTypeEnum CacheType { get; set; }
}
StartUp.cs中 ConfigureServices注入写法:
services.AddXX((option) => {
option.CacheAbsoluteExpirationRelativeToNow = 600;
option.CacheType = CacheTypeEnum.Redis;
});
更多技能关注 .NET Core 跨平台
可以思考参见sass的模式,根据请求头中的tenant标识自动寻找对应的数据库。
1.option选项模式
2.工厂模式