ABP入门系列目录——学习Abp框架之实操演练
源码路径:Github-LearningMpaAbp
一、AbpSession是Session吗?
1、首先来看看它们分别对应的类型是什么?
查看源码发现Session
是定义在Controller中的类型为HttpSessionStateBase
的属性。
public HttpSessionStateBase Session { get; set; }
再来看看AbpSession
是何须类也,咱们定位到AbpController
中看一看。
public IAbpSession AbpSession { get; set; }
好吧,原来AbpSession是IAbpSession类型啊。但这就可以断定AbpSession不是Session吗?
未必吧,如果IAbpsession的具体实现中还是依赖Session也不一定哦,如果是这样,那AbpSession可以算作Session的扩展,也可以说是Session。
咱还是找找IAbpsession的具体实现一探究竟吧。
Abp中对IAbpsession有两个实现方式,一种是NullAbpSession
,NullAbpSession
是空对象设计模式,用于属性注入时,在构造函数中对其初始化。
另一种是ClaimsAbpSession
,咱们来一探究竟。
2、一探究竟ClaimsAbpSession
以下代码是ClaimsAbpSession
的节选:
/// <summary>
/// Implements <see cref="IAbpSession"/> to get session properties from claims of <see cref="Thread.CurrentPrincipal"/>.
/// </summary>
public class ClaimsAbpSession : IAbpSession, ISingletonDependency
{
public virtual long? UserId
{
get
{
var userIdClaim = PrincipalAccessor.Principal?.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier);
if (string.IsNullOrEmpty(userIdClaim?.Value))
{
return null;
}
long userId;
if (!long.TryParse(userIdClaim.Value, out userId))
{
return null;
}
return userId;
}
}
public IPrincipalAccessor PrincipalAccessor { get; set; }
public ClaimsAbpSession(IMultiTenancyConfig multiTenancy)
{
MultiTenancy = multiTenancy;
PrincipalAccessor = DefaultPrincipalAccessor.Instance;
}
}
其中IPrincipalAccessor
又是什么鬼,从构造函数来看,DefaultPrincipalAccessor
应该是个单例模式。
public class DefaultPrincipalAccessor : IPrincipalAccessor, ISingletonDependency
{
public virtual ClaimsPrincipal Principal => Thread.CurrentPrincipal as ClaimsPrincipal;
public static Def