Webforms 中的多租户
Multi-Tenancy in Webforms
我已经成功地使用 Saaskit 在 MVC 应用程序中实现了多租户。应用程序为每个租户都有一个单独的数据库。我想在 webforms 项目中实现类似的东西。谁能指出我正确的方向?有可能吗?
必须有:
- 基于domain/url
的租户检测
- 每个租户必须支持数据库
默认成员资格 API 应该足以满足要求。
如果没有,考虑http://www.asp.net/general/videos/how-do-i-create-a-custom-membership-provider
参考教程> http://www.asp.net/security/tutorials
视频http://www.asp.net/security/videos
上述教程中介绍了最佳做法。
设法使用 Webforms 4.7.2 中的新 Unity 支持来支持此功能:
public class TenantResolver : ITenantResolver
{
public Tenant GetTenant()
{
var identifier = HttpContext.Current.Request.Url.Host.ToLower();
return AllTenants().FirstOrDefault(x => x.HostNames.Any(a => a.Hostname.Contains(identifier)));
}
public List<Tenant> AllTenants()
{
// return list of tenants from configuration or seperate db
}
}
正在启动
void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
var container = this.AddUnity();
container.RegisterType<ITenantResolver, TenantResolver>();
container.RegisterType<ApplicationContext, ApplicationContext>();
}
可访问租户的示例页面
public partial class About : Page
{
readonly Tenant tenant;
readonly ApplicationContext _context;
public About(ITenantResolver tenantresolver, ApplicationContext context)
{
tenant = tenantresolver.GetTenant();
_context = context;
}
protected void Page_Load(object sender, EventArgs e)
{
}
}
每个租户的数据库上下文示例
public class ApplicationContext : DbContext
{
public ApplicationContext(ITenantResolver tenantResolver) : base(ConnectionStringResolver(tenantResolver)) {
}
private string ConnectionStringResolver(AppTenant appTenant)
{
var tenant = tenantResolver.GetTenant();
if (tenant != null)
{
return tenant.ConnectionString;
}
throw new NullReferenceException("Tenant Not Found");
}
}
我已经成功地使用 Saaskit 在 MVC 应用程序中实现了多租户。应用程序为每个租户都有一个单独的数据库。我想在 webforms 项目中实现类似的东西。谁能指出我正确的方向?有可能吗?
必须有:
- 基于domain/url 的租户检测
- 每个租户必须支持数据库
默认成员资格 API 应该足以满足要求。
如果没有,考虑http://www.asp.net/general/videos/how-do-i-create-a-custom-membership-provider
参考教程> http://www.asp.net/security/tutorials
视频http://www.asp.net/security/videos
上述教程中介绍了最佳做法。
设法使用 Webforms 4.7.2 中的新 Unity 支持来支持此功能:
public class TenantResolver : ITenantResolver
{
public Tenant GetTenant()
{
var identifier = HttpContext.Current.Request.Url.Host.ToLower();
return AllTenants().FirstOrDefault(x => x.HostNames.Any(a => a.Hostname.Contains(identifier)));
}
public List<Tenant> AllTenants()
{
// return list of tenants from configuration or seperate db
}
}
正在启动
void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
var container = this.AddUnity();
container.RegisterType<ITenantResolver, TenantResolver>();
container.RegisterType<ApplicationContext, ApplicationContext>();
}
可访问租户的示例页面
public partial class About : Page
{
readonly Tenant tenant;
readonly ApplicationContext _context;
public About(ITenantResolver tenantresolver, ApplicationContext context)
{
tenant = tenantresolver.GetTenant();
_context = context;
}
protected void Page_Load(object sender, EventArgs e)
{
}
}
每个租户的数据库上下文示例
public class ApplicationContext : DbContext
{
public ApplicationContext(ITenantResolver tenantResolver) : base(ConnectionStringResolver(tenantResolver)) {
}
private string ConnectionStringResolver(AppTenant appTenant)
{
var tenant = tenantResolver.GetTenant();
if (tenant != null)
{
return tenant.ConnectionString;
}
throw new NullReferenceException("Tenant Not Found");
}
}