Frage

Wie könnte ich verwende das Caching vielleicht entlang dieses Attribut helfen? Vor allem hat nicht eine Menge Anrufe zu container.GetService und bekommen die Benutzer zu machen. kann ich einige Caching in Position gebracht, die die Identität als Schlüssel und den Planer als Wert cachen würde und es nur nach oben schauen?

    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 ...

so etwas wie das?

 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" }));
        }
    }
War es hilfreich?

Lösung

Sie könnten die integrierten Cache verwenden:

filterContext.HttpContext.Cache
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top