ABP .NET Core 通过 AbpSession 扩展获取 UserName(一)

这篇文章主要用于记录使用 ABP 过程。下面是这篇文章的主要代码,代码被放在 Core 层,因为是扩展方法所以不是必须放在 Core 层。

    public static class AbpSessions
    {
        private static Dictionary<long?, AbpLoginResult<Tenant, User>> dict;

        /// <summary>
        /// 保存登录用户信息
        /// </summary>
        /// <param name="user"></param>
        public static void SaveUserToCache(AbpLoginResult<Tenant, User> user)
        {
            if (dict == null) dict = new Dictionary<long?, AbpLoginResult<Tenant, User>>();

            if (!dict.ContainsKey(user.User.Id))
            {
                dict.Add(user.User.Id, user);
            }
        }

        /// <summary>
        /// 获取当前登录用户名
        /// </summary>
        /// <param name="session"></param>
        /// <returns></returns>
        public static string GetUserName(this IAbpSession session)
        {
            return dict.ContainsKey(session.UserId)
                ? dict[session.UserId].User.UserName
                : string.Empty;
        }
    }

在登录的地方调用 SaveUserToCache 将用户登录信息保存起来:

AbpSessions.SaveUserToCache(loginResult);

这样我们就可以是所有 AbpSession.GetUserName() 扩展方法获取当前用户的 UserName:

AbpSession.GetUserName();//获取当前登录用户 UserName

整个实现就是这样,下面我再将整个过程记录下来,一下都是些废话,可以不用看了。

 

最开始通过在网上搜索,找到 记AbpSession扩展实现过程 这篇文章是最想要的结果,但是因为当前我使用的 ABP 项目版本已经升级到 4.0.2,所以一直没有找到文章中的 SignInAsync 方法,直到从官网下载 ABP官网源码 才弄清楚,原来新版是将实现 identity.AddClaim 挪到了框架内部。所以我无法继续使用文中方法来实现扩展属性。

我首先想到的就是修改当前的源码来实现,这样用来肯定是最好的,并且的确我也这样做了。但是最终我还是选择了通过扩展方法来实现。主要是考虑到以后如果 ABP 框架升级,我不得不去手动将代码更新一遍,这样做太麻烦了,浪费时间。

如果读者有其他实现方法,欢迎交流。

posted @ 2018-12-12 16:45  Jöhan  阅读(318)  评论(0编辑  收藏  举报