abp學習日誌八(多租戶)

多租戶

這是一個傳統企業中比較常見的業務需求,總分公司結構數據總分存儲和同步的問題。系統上的數據劃分體現的就是多租戶的情況。

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 生成的租戶庫

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章