개체 컨텍스트의 5 폐기 : 현재ASP MVC 나는 다음과 같은 사용자 권한을 확인하기 위해 데이터베이스를 조회 할 필요가있는 확장 방법이
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);
}
}
데이터베이스에 ApplicationUser가 얼마나 있습니까? 이 숫자가 증가하거나 상당히 유사하다고 생각하십니까? 귀하의 'hasPermission' 응용 프로그램이 잘 보입니다. 그러면 가비지 수집기가 블록 끝에있는 컨텍스트 개체를 파괴 할 것이므로 메모리를 확보하십시오. 그러나 동일한 사용자에 대한 권한을 반복해서 확인하는 경우 지속적으로 데이터베이스를 다시 쿼리하지 않고 해당 개체를 메모리에 저장해 두는 것이 좋습니다. – gudthing
@gudthing 그래서 그것을 사용하는 블록으로 싸지 않아도됩니까? 사용자 수는 500-1000 사이에서 증가합니다. – adam78
@ gudthing 어떻게 메모리에 저장 하시겠습니까? 일부 코드 샘플은 설명하는 데 도움이됩니까? – adam78