2010-12-01 9 views
1

Comment utiliser la mise en cache pour aider cet attribut? Principalement ne pas avoir à faire beaucoup d'appels à container.GetService et obtenir l'utilisateur. Est-ce que je pourrais mettre en place une mise en cache qui mettrait en cache l'identité en tant que clé et le planificateur en tant que valeur et que je rechercherais juste?Comment mettre en cache des éléments dans un filtreAttribute

public class AdminsAndProgramManagersOnlyAttribute : FilterAttribute, IAuthorizationFilter 
{ 
    public AdminsAndProgramManagersOnlyAttribute() 
    { 
     Order = 1; //Must come AFTER AuthenticateAttribute 
    } 

    public void OnAuthorization(AuthorizationContext filterContext) 
    { 
     var userRepository = GlobalApplication.container.GetService<IRepository<ProjectPlannerInfo>>(); 
     var identity = filterContext.HttpContext.User.Identity; 
     var planner = userRepository.GetAll().WhereEmailIs(identity.Name); 

     if (!planner.IsInRole("Db Admin") || planner.ProgramManager == 1) 
     { 
      filterContext.Result = new RedirectToRouteResult("error", new RouteValueDictionary(new { controller = "Error", action = "InsufficientPrivileges", reason = "Contract" })); 
     } 
    } 
} 

soo ...

quelque chose comme ça?

public void OnAuthorization(AuthorizationContext filterContext) 
    { 
     var identity = filterContext.HttpContext.User.Identity; 

     if (filterContext.HttpContext.Cache[identity.Name] == null) 
     { 
      if (filterContext.HttpContext.Cache["repo"] == null) 
      { 
       filterContext.HttpContext.Cache.Add("repo", GlobalApplication.container.GetService<IRepository<ProjectPlannerInfo>>(), null, DateTime.Now.AddSeconds(30), Cache.NoSlidingExpiration, CacheItemPriority.Normal, null); 
      } 

      var userRepository = filterContext.HttpContext.Cache["repo"] as IRepository<ProjectPlannerInfo>; 

      filterContext.HttpContext.Cache.Add(identity.Name, userRepository.GetAll().WhereEmailIs(identity.Name), null, DateTime.Now.AddSeconds(30), Cache.NoSlidingExpiration, CacheItemPriority.Normal, null); 
     } 

     var planner = filterContext.HttpContext.Cache[identity.Name] as ProjectPlannerInfo; 

     if (!planner.IsInRole("Db Admin") || planner.ProgramManager == 1) 
     { 
      filterContext.Result = new RedirectToRouteResult("error", new RouteValueDictionary(new { controller = "Error", action = "InsufficientPrivileges", reason = "Contract" })); 
     } 
    } 

Répondre

2

Vous pouvez utiliser le haut-cache:

filterContext.HttpContext.Cache 
+0

ne me modifier reflète ce que vous aviez à l'esprit? – Steve

Questions connexes