我有一个扩展方法,需要查询数据库以检查用户权限,如下所示:
public static bool HasPermission(this IPrincipal user, string permission)
{
ApplicationUser appUser = ApplicationUserManager.GetUser(user.Identity.GetUserId());
return appUser.HasPermission(permission);
}
目前,获取应用程序用户的调用实现如下:
public static ApplicationUser GetUser(string userId)
{
return GetUser(new ApplicationDbContext(), userId);
}
public static ApplicationUser GetUser(ApplicationDbContext context, string userId)
{
ApplicationUser _retVal = null;
try
{
_retVal = context.Users.Where(p => p.Id == userId).FirstOrDefault();
}
catch (Exception)
{
}
return _retVal;
}
现在在我的视图和控制器操作中,我经常调用User.HasPermission()方法。所以我考虑了经常调用这种方法的性能含义。是否更好地将一个调用包装在using语句中,如下所示,以便上下文被处理掉,或者我在上面已经实现它的方式中是否正确?
public static bool HasPermission(this IPrincipal user, string permission)
{
using (ApplicationDbContext _context = new ApplicationDbContext())
{
var userId = user.Identity.GetUserId();
ApplicationUser applicationUser = _context.Users.Where(p => p.Id == userId).FirstOrDefault();
return applicationUser.HasPermission(permission);
}
}
答案 0 :(得分:0)
处理数据库上下文是个好主意。我会将上下文放入包装类中,并通过特定方法处理特定于应用程序的数据库请求。例如GetUser(id),GetAllItems(),GetSingleItem(id),GetItemsByCategory(category)等。当您有许多不同的资产类型时,使用c#泛型,存储库和基类可以帮助解决这些类型的调用的重复性。
这可确保为所需的每个实例调用和处理dbcontext。 e.g。
在一页请求
另外,我会在加载时将用户的整个权限集直接添加到User类,而不是为每个“HasPermission”请求单独调用DB。
使用缓存机制(即MemoryCache)存储该用户对象及其权限集。这种相同的缓存机制也可用于存储应用程序数据。如果你谷歌周围有一些预先建立的,但建立一个基本的并不困难。
通过缓存,用户可以从您的网站请求某些内容,并且已经知道他们是谁以及他们可以访问的内容,而无需再次触摸数据库,至少几分钟,可能更长,具体取决于频率权限更改。 5-15分钟的权限缓存是非常合理的。缓存删除技术可以确保权限集始终准确,假设您控制权限存储本身或具有可以触发更新的挂钩。