FilterAttribute内のアイテムをキャッシュする方法
-
29-09-2019 - |
質問
キャッシュを使用して、この属性を使用するのに役立つ可能性がありますか?主に、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" }));
}
}
解決
組み込みのキャッシュを使用できます。
filterContext.HttpContext.Cache
所属していません StackOverflow