高效缓存身份相关实体

时间:2014-03-04 07:57:04

标签: c# asp.net-mvc asp.net-mvc-5 asp.net-identity

我使用的是asp.net MVC5和asp.net Identity v2(来自每晚版本),但我认为这个问题仍然适用于身份V1。

我有会员制,我通过AspNetUser表格中的字段membershipuserAspUserId实体关联到我的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; }
    .....
}

我想知道在请求的生命周期中缓存您的成员资格用户记录的最佳方法是什么。这样:

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 :(得分: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;
}
相关问题