高效缓存身份相关实体

4
我正在使用asp.net MVC5和asp.net Identity v2(来自夜间发布),但我认为此问题仍适用于Identity V1。
我有一个会员制系统,我正在通过membershipuser表中的AspUserId字段将AspNetUser实体链接到我的membershipuser实体。
public partial class membershipuser
{
    public int id { get; set; }
    public string full_name { get; set; }
    public string address { get; set; }
    public string AspNetUserId { get; set; }
    .....
}

我想知道缓存MembershipUser记录的最佳方法,让其在请求的生命周期内保持不变。这样做的好处是:
public static class extensions
    {
        public static membershipuser GetMember(this System.Security.Principal.IPrincipal User)
        {
            string currentUserId = User.Identity.GetUserId();
            return new MemberEntities().membershipusers.FirstOrDefault(m => m.AspNetUserId == currentUserId );
        }
    }

或者这样做:
 public abstract partial class BaseController : Controller
{
    private membershipuser _Member;

    public membershipuser Member
    {
        get { 
            if(_BASRaTMember == null)
            {
               string currentUserId = User.Identity.GetUserId(); 
                BASRaTMember = new BasratEntities().tbl_basrat_members.FirstOrDefault(m => m.AspNetUserId == currentUserId );
            }
            return _BASRaTMember; 
        }
        private set { _BASRaTMember = value; }
    }

}

我认为最好使用BaseController方法,因为如果我调用扩展方法5次以检查成员属性,那么它将会查询用户数据库5次。或者是更好的方法是将其存储在请求中吗?我的唯一目的是在用户经过身份验证后减少请求的数据库查找。

1个回答

0

如果您遵循使用单个DbContext(OwinContext)每个请求的样本模式,则在2.0中这不是太大的问题,因为DbContext会自行进行此类缓存。但是,如果您想保证缓存用户的UserId,而不考虑特定存储缓存行为,您需要通过某种帮助程序方法而不是直接使用用户管理器来显式缓存用户。该帮助程序将负责填充缓存,例如:

public async Task<TUser> GetUser(this IOwinContext context, TKey userId, UserManager<TUser, TKey> manager) {
      var contextKey = "computeYourCacheKey"+userId;
      var user = context.Get<TUser>(contextKey);
      if (user == null) {
          user = await manager.FindByIdAsync(userId);
          context.Set<TUser>(userId, user);
      }
      return user;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接