1

我怎么能使用缓存来帮助这个属性呢?主要是不必对 container.GetService 进行大量调用并获取用户。我可以放置一些缓存,将身份缓存为键,将规划器缓存为值,然后查找它吗?

    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" }));
        }
    }
}

苏...

像这样的东西?

 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" }));
        }
    }
4

1 回答 1

2

您可以使用内置缓存:

filterContext.HttpContext.Cache
于 2010-12-01T18:19:17.053 回答