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 取得,为了让代码看起来更协调,所以在这里也放一个。