ABP .NET Core 通过 AbpSession 获取 UserName (二)

private static Dictionary<long?, User> dict;//保存用户信息,减少请求次数

/// <summary>
/// 保存登录用户信息
/// </summary>
/// <param name="user"></param>
public void SaveUserToCache(User user)
{
    if (dict == null) dict = new Dictionary<long?, User>();
    if (!dict.ContainsKey(user.Id))
    {
        dict.Add(user.Id, user);
    }
}

/// <summary>
/// 获取当前登录用户信息
/// </summary>
/// <returns></returns>
public User GetUser()
{
    var userId = AbpSession.UserId;
    if (dict != null && dict.ContainsKey(userId))
        return dict[userId];

    var user = AsyncHelper.RunSync(() => GetUserByIdAsync(userId.Value));
    SaveUserToCache(user);

    return user;
}

/// <summary>
/// 获取登录用户标识
/// </summary>
public long? UserId { get { return AbpSession.UserId; } }

/// <summary>
/// 获取登录用户名
/// </summary>
/// <returns></returns>
public string UserName { get { return GetUser()?.UserName; } }

上面代码在 Authorization.Users.UserManager.cs 类中用户信息被存在 dict 静态变量中。用户登录时调用 SaveUserToCache 将信息保存起来(这样做还有一个好处,当服务重启后,依然可以继续使用而不需要重新登录)。

在需要调用的地方将 UserManager 注入,就可以通过 UserManager 的实例访问到 UserName 和 UserId 属性,例如:

entity.CreatorUserName = userManager.UserName;

注:UserId 本来可以直接通过 AbpSession.UserId 取得,为了让代码看起来更协调,所以在这里也放一个。

posted @ 2019-01-08 18:45  Jöhan  阅读(272)  评论(0编辑  收藏  举报