ABP入门系列(10)——扩展AbpSession

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有两个实现方式,一种是NullAbpSessionNullAbpSession是空对象设计模式,用于属性注入时,在构造函数中对其初始化。
另一种是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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值