这个想法是确定当前请求tenant_id并使用它来获取数据库配置并创建DbContext,如下面的代码。
public AppDbContext : DbContext
{
private const string _defaultCS = "default app connection string";
public AppDbContext() : base(GetConnectionString())
{
}
private string GetConnectionString()
{
return TenantContext.ConnectionString ?? _defaultCS;
}
}
使用范例
public class StudentRepo
{
public Student Get(Guid id)
{
using(var ctx = new AppDbContext())
{
return ctx.Students.FirstOrDefault(x=>x.Id == id);
}
}
}
这将自动连接到登录的用户数据库。
您可能需要tenant_id存储在验证cookie,并PostAuthenticate_Event后读取并将其存储在HttpContext.Current.Items
public static TenantContext
{
public static Guid TenantId
{
get
{
return (Guid)HttpContext.Current.Items["__TenantID"];
}
}
public static string ConnectionString
{
get
{
return TenantConfigService.GetConnectionString(TenantId);
}
}
}
在某些HTTP模块初始化方法
context.PostAuthenticateRequest += context_PostAuthenticateRequest;
void context_PostAuthenticateRequest(object sender, EventArgs e)
{
FormsIdentity identity = Thread.CurrentPrincipal.Identity as FormsIdentity;
if (identity != null)
{
HttpContext.Current.Items["__TenantID"] = GetTenantIdFromTicket(identity.Ticket.UserData); // returns tenant_id as guid type
}
}
你能分享一些工作样品。 –
以上代码是工作示例的摘录。如果您需要完整的工作示例,那么我推荐techcello.com,他们在.NET中有一个非常棒的SaaS框架,这可能是您需要的。 – cackharot