ASP MVC 5处置对象上下文

时间:2016-08-02 21:10:01

标签: c# asp.net-mvc entity-framework objectcontext

我有一个扩展方法,需要查询数据库以检查用户权限,如下所示:

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

1 个答案:

答案 0 :(得分:0)

处理数据库上下文是个好主意。我会将上下文放入包装类中,并通过特定方法处理特定于应用程序的数据库请求。例如GetUser(id),GetAllItems(),GetSingleItem(id),GetItemsByCategory(category)等。当您有许多不同的资产类型时,使用c#泛型,存储库和基类可以帮助解决这些类型的调用的重复性。

这可确保为所需的每个实例调用和处理dbcontext。 e.g。

在一页请求

  • GetUser(open-dispose)
  • GetSomethingElse(再次开放处理)
  • SaveSomething(再次开放处理)

另外,我会在加载时将用户的整个权限集直接添加到User类,而不是为每个“HasPermission”请求单独调用DB。

使用缓存机制(即MemoryCache)存储该用户对象及其权限集。这种相同的缓存机制也可用于存储应用程序数据。如果你谷歌周围有一些预先建立的,但建立一个基本的并不困难。

通过缓存,用户可以从您的网站请求某些内容,并且已经知道他们是谁以及他们可以访问的内容,而无需再次触摸数据库,至少几分钟,可能更长,具体取决于频率权限更改。 5-15分钟的权限缓存是非常合理的。缓存删除技术可以确保权限集始终准确,假设您控制权限存储本身或具有可以触发更新的挂钩。