基於DDD的現代ASP.NET開發框架--ABP系列之7、ABP Session管理
ABP是“ASP.NET Boilerplate Project (ASP.NET樣板項目)”的簡稱。
ABP的官方網站:http://www.aspnetboilerplate.com
ABP在Github上的開源項目:https://github.com/aspnetboilerplate
簡介
如果一個應用程序需要登錄,則它必須知道當前用戶執行了什么操作。因此ASP.NET在展示層提供了一套自己的SESSION會話對象,而ABP則提供了一個可以在任何地方
獲取當前用戶和租戶的IAbpSession接口。
關於IAbpSession
需要獲取會話信息則必須實現IAbpSession接口。雖然你可以用自己的方式去實現它(IAbpSession),但是它在module-zero項目中已經有了完整的實現。
注入Session
IAbpSession通常是以屬性注入的方式存在於需要它的類中,不需要獲取會話信息的類中則不需要它。如果我們使用屬性注入方式,我們可以用
NullAbpSession.Instance作為默認值來初始化它(IAbpSession),如下所示:
public class MyClass : ITransientDependency { public IAbpSession AbpSession { get; set; } public MyClass() { AbpSession = NullAbpSession.Instance; } public void MyMethod() { var currentUserId = AbpSession.UserId; //... } }
由於授權是應用層的任務,因此我們應該在應用層和應用層的上一層使用IAbpSession(我們不在領域層使用IAbpSession是很正常的)。
ApplicationService, AbpController 和 AbpApiController 這3個基類已經注入了AbpSession屬性,因此在Application Service的實例方法中,能直接使用AbpSession屬性。
使用Session屬性
AbpSession定義的一些關鍵屬性:
- UserId: 當前用戶的標識ID,如果沒有當前用戶則為null.如果需要授權訪問則它不可能為空。
- TenantId: 當前租戶的標識ID,如果沒有當前租戶則為null。
- MultiTenancySide: 可能是Host或Tenant。
UserId和TenantId是可以為null的。當然也提供了不為空時獲取數據的 GetUserId()和GetTenantId() 方法 。當你確定有當前用戶時,你可以使用GetUserId()方法。
如果當前用戶為空,使用該方法則會拋出一個異常。GetTenantId()的使用方式和GetUserId()類似。
陽銘注:
ABP框架中的AbpSession, 並沒有使用到System.Web.HttpSessionStateBase, 而是自己定義了一個Abp.Runtime.Session.IAbpSession接口, 並在Zero模塊中通過AspNet.Identity組件實現了AbpSession對象的存值、取值。 所以即使Web服務重啟,也不會丟失Session狀態。
在我自己的項目中, Session對象只有UserId、TenantId、MultiTenancySide這幾個屬性是不夠用的,我擴充了幾個屬性和方法,使用起來非常方便。有這個需求的朋友,歡迎加入QQ群與我交流。
希望更多國內的架構師能關注到ABP這個項目,也許這其中有能幫助到您的地方,也許有您的參與,這個項目可以發展得更好。
歡迎加ABP架構設計交流QQ群:134710707