2016-08-02 1 views
0

개체 컨텍스트의 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); 
     } 
    } 
+0

데이터베이스에 ApplicationUser가 얼마나 있습니까? 이 숫자가 증가하거나 상당히 유사하다고 생각하십니까? 귀하의 'hasPermission' 응용 프로그램이 잘 보입니다. 그러면 가비지 수집기가 블록 끝에있는 컨텍스트 개체를 파괴 할 것이므로 메모리를 확보하십시오. 그러나 동일한 사용자에 대한 권한을 반복해서 확인하는 경우 지속적으로 데이터베이스를 다시 쿼리하지 않고 해당 개체를 메모리에 저장해 두는 것이 좋습니다. – gudthing

+0

@gudthing 그래서 그것을 사용하는 블록으로 싸지 않아도됩니까? 사용자 수는 500-1000 사이에서 증가합니다. – adam78

+0

@ gudthing 어떻게 메모리에 저장 하시겠습니까? 일부 코드 샘플은 설명하는 데 도움이됩니까? – adam78

답변

0

데이터베이스 컨텍스트를 삭제하는 것이 좋습니다. 컨텍스트를 래퍼 클래스에 넣고 특정 메서드를 통해 응용 프로그램 별 db 요청을 처리합니다. 예 : GetUserItem(), GetAllItems(), GetSingleItem (id), GetItemsByCategory (category) 등 많은 종류의 자산 유형이있을 때 리포지토리와 기본 클래스를 사용하면 C# generics를 반복적으로 사용할 수 있습니다.

이렇게하면 필요한 각 인스턴스에 대해 dbcontext가 호출되고 삭제되지 않습니다. 예 :

한 페이지 요청에 대해

  • 인 getUser (오픈 폐기)
  • GetSomethingElse는
  • SaveSomething을 (다시 오픈 처리)

또한 (다시 오픈 처리) 각 HasPermission 요청에 대해 별도의 DB 호출을 작성하는 대신로드 된 사용자 클래스에 사용자의 전체 권한 세트를 직접 추가합니다.

캐시 메커니즘 (예 : MemoryCache)을 사용하여 해당 사용자 개체를 권한 집합과 함께 저장합니다. 이 동일한 캐시 메커니즘을 사용하여 앱 데이터를 저장할 수도 있습니다. 거기에 몇 가지 사전 내장 된 것들이 당신이 구글에 있지만 기본 하나를 설정하는 것은 어렵지 않다면 거기 밖으로있다.

사용자가 캐싱을하면 사이트에서 무언가를 요청하고 DB에 (다시) 접촉하지 않고도 액세스 권한이있는 사용자를 이미 몇 분 동안, 아마도 더 길게 종종 권한이 변경됩니다. 5-15 분의 허가 캐시는 꽤 합리적입니다. 캐시 제거 기술을 사용하면 사용 권한 저장소 자체를 제어하거나 최종 업데이트를 트리거 할 수있는 훅이 있다고 가정 할 때 사용 권한 집합이 항상 정확한지 확인할 수 있습니다.

관련 문제