點這裏進入ABP系列文章總目錄html
基於DDD的現代ASP.NET開發框架--ABP系列之七、ABP Session管理
git
ABP是「ASP.NET Boilerplate Project (ASP.NET樣板項目)」的簡稱。github
ABP的官方網站:http://www.aspnetboilerplate.com架構
ABP在Github上的開源項目:https://github.com/aspnetboilerplate框架
若是一個應用程序須要登陸,則它必須知道當前用戶執行了什麼操做。所以ASP.NET在展現層提供了一套本身的SESSION會話對象,而ABP則提供了一個能夠在任何地方
獲取當前用戶和租戶的IAbpSession接口。ide
關於IAbpSession網站
須要獲取會話信息則必須實現IAbpSession接口。雖然你能夠用本身的方式去實現它(IAbpSession),可是它在module-zero項目中已經有了完整的實現。spa
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屬性。
AbpSession定義的一些關鍵屬性:
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