我們已經建立了一個功能齊全的應用程序,現在,我們需要將它轉換爲多租戶應用。
啓用多租戶模式
在最初我們將多租戶模式禁用了,現在在AbpZeroTemplateCoreModule類裏重新啓用它:
Configuration.MultiTenancy.IsEnabled = true;
讓Entity適應多租戶
在多租戶應用裏,租戶的實體應該與其他租戶隔離。在這個例子中,每個租戶應該有自己的電話簿,並且不能被其他租戶看見。
當我們實現IMustHaveTenant 接口,ABP會根據當前用戶自動篩選數據,同時從數據庫中檢索業務實體。所以,我們應該定義Person實體需要實現IMustHaveTenant 接口:
[Table("PbPersons")]
public class Person : FullAuditedEntity, IMustHaveTenant
{
public const int MaxNameLength = 32;
public const int MaxSurnameLength = 32;
public const int MaxEmailAddressLength = 255;
public virtual int TenantId { get; set; }
[Required]
[MaxLength(MaxNameLength)]
public virtual string Name { get; set; }
[Required]
[MaxLength(MaxSurnameLength)]
public virtual string Surname { get; set; }
[MaxLength(MaxEmailAddressLength)]
public virtual string EmailAddress { get; set; }
public virtual ICollection<Phone> Phones { get; set; }
}
我們可能希望讓Phone實體也實現IMustHaveTenant接口。如果我們直接使用phone repository來獲取手機信息,那這是必要的。但在這個例子中,不必這麼做。
因爲實體發生了改變,我們需要創建新的數據遷移對象:
Add-Migration "Implemented_IMustHaveTenant_For_Person"
此命令將會創建一個新的數據遷移對象,遷移類增加了自動過濾所需的註釋。我們不必知道它是什麼,因爲它是自動完成的。並且它在pbpersons表裏增加了一個tenantid欄,如下所示:
AddColumn("dbo.PbPersons", "TenantId", c => c.Int(nullable: false, defaultValue: 1));
我在最後加了一個默認值設置爲1的選項。因此,當前people將自動被標記爲默認租戶(默認租戶的ID爲1)。
現在,我們再次更新數據庫:
Update-Database
運行多租戶應用
已經搞定了!我們可以測試下這個應用,運行並進行登錄:
當我們啓用了多租戶模式,我們會在登錄界面中看到多出來一個租戶名稱的輸入框。當我們不輸入它,我們將作爲管理員進行登錄。默認的admin賬號密碼爲123qwe。
登錄後,我們看到租戶列表。我們可以添加新的租戶:
我創建了一個新的租戶叫NOVA。於是,租戶列表中就包含了兩個租戶:
我可以註銷並以NOVA的管理員登錄:
當我們登錄後,我們可以看到我們的電話簿是空的:
因爲nova的電話簿信息是完全獨立的,所以這裏是空的。你可以添加信息,並且登錄不同的租戶,你可以發現不同的租戶之間的電話簿是不一樣的。
刪除SPA
如果你開發的是MPA,那麼你肯定希望在項目中刪除SPA相關文件。非常簡單:在.Web項目中,刪除以下文件及文件夾
- 刪除App文件夾,它包含SPA的Angularjs
- 刪除AppBundleConfig 和 AppNavigationProvider
- 另外,你可以刪除ApplicationController類並且改變AccountController到HomeController 的重定向
結論
在這個DEMO中,我們建立了一個完整的例子,覆蓋了ASP.NET Zero大多數部分。希望能幫助你構建自己的應用系統。
我們故意使用不同的方法來處理類似的任務,以顯示不同的開發風格。ASPNET零提供了一個架構,但不限制你。你可以做自己的風格發展。