高效缓存身份相关实体

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

我有一个会员系统,我通过membershipuser表中的字段AspUserIdAspNetUser实体链接到我的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次。 或者以某种方式将它存储在请求中会更好吗? 我的唯一目的是在用户通过身份validation后减少请求的数据库查找。

因此,如果您遵循每个请求使用单个DbContext的样本模式(OwinContext),这在2.0中不是问题,因为DbContext会执行此类缓存。 但是,如果您想要保证此缓存而不管特定的存储缓​​存行为,您可以通过UserId显式缓存用户,您需要通过某种辅助方法而不是直接使用用户管理器。 帮助器将负责填充缓存,即这样的事情

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