多租戶
這是一個傳統企業中比較常見的業務需求,總分公司結構數據總分存儲和同步的問題。系統上的數據劃分體現的就是多租戶的情況。
APP模板
在App模板下多租戶是自動開啓的,所以完全不用修改任何功能。
Module模板
在Module模板下,需要修改MultiTenancyConsts中的IsEnabled=true;
項目文件結構如下
系統提供的租戶解析器
- CurrentUserTenantResolveContributor: 如果當前用戶已登錄,從當前用戶的聲明中獲取租戶Id. 出於安全考慮,應該始終將其做爲第一個Contributor.
- QueryStringTenantResolveContributor: 嘗試從query string參數中獲取當前租戶,默認參數名爲"__tenant".
- RouteTenantResolverContributor:嘗試從當前路由中獲取(URL路徑),默認是變量名是"__tenant".所以,如果你的路由中定義了這個變量,就可以從路由中確定當前租戶.
- HeaderTenantResolverContributor: 嘗試從HTTP header中獲取當前租戶,默認的header名稱是"__tenant".
- CookieTenantResolverContributor: 嘗試從當前cookie中獲取當前租戶.默認的Cookie名稱是"__tenant".
- DomainTenantResolveContributor:嘗試從二級域名進行解析
樣例
上圖中通過TenantKey修改默認的參數名稱,可以避免在nginx反向代理時出現的錯誤
添加域名解析的方式
options.AddDomainTenantResolver("{0}.mydomain.com");
實體需要做的事情
繼承 IMultiTenant
public class Product : FullAuditedAggregateRoot<Guid>, IMultiTenant
{
public string ProductName { get; set; }
public string ProductUnit { get; set; }
public string ProductDescription { get; set; }
public decimal ProductPrice { get; set; }
public decimal StoreNumbers { get; set; }
public string Note { get; set; }
public Guid? TenantId { get; set; }
protected Product()
{
}
public Product(Guid id)
: base(id)
{
}
}
如何禁用多租戶數據過濾
通過注入IUnitOfWorkManager對象,在查詢之前使用
using(_unitofwork.Current.DisableFilter(AbpDataFilters.MayHaveTenant))
{
//TODO
}
多租戶分庫存儲
可以通過管理員頁面配置來連接字符串,也可以通過數據庫自己添加。
數據表手動insert
管理員界面配置
求助
多租戶分庫存儲,那麼租戶數據庫的結構怎麼生成呢,我是通過修改連接字符串,重新做了update-database 生成的租戶庫