这篇文章主要用于记录使用 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 框架升级,我不得不去手动将代码更新一遍,这样做太麻烦了,浪费时间。
如果读者有其他实现方法,欢迎交流。