2

MVC 5 인터넷 응용 프로그램을 개발 중이며 ApplicationUser 객체에 사용자 정의 객체를 갖는 것과 관련하여 질문이 있습니다.MVC 5 - ApplicationUser 객체 검색

내 MVC 5 응용 프로그램의 객체에 대한 최대 개수 변수를 많이 보유하고있는 ApplicationUser 객체에 public virtual Account account 객체가 있습니다. 이 값은 사용자가 계정을 등록 할 때 각 사용자에 대해 설정됩니다.

모델 개체를 만들기 전에 사용자가 모델 개체의 최대 개수를 초과하지 않았는지 확인합니다. 이는 오브젝트에 대한 서비스 클래스에서 수행됩니다.

var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())); 
ApplicationUser user = userManager.FindByNameAsync(userName).Result; 
int maxFiles = user.account.maxFiles; 

나는 ApplicationUser 개체를 검색하기 위해 유사한 코드 많은 개체에 대한 많은 서비스 클래스를 사용하고 있습니다 : 여기

은 파일 객체에 사용되는 코드의 예입니다.

내 질문은 : 각 서비스 클래스에 대해 매번 ApplicationUser 개체를 검색하는 대신 사용자가 로그온 할 때이 개체를 저장 한 다음 모델 개체를 만들기 전에이 개체를 참조 할 수 있습니까? 그렇다면 위의 목적을 위해이 객체를 어디에 저장할 수 있습니까?

또한 ApplicationUser 개체를 검색 할 때 얼마나 많은 메모리/대역폭이 사용됩니까? 모델 객체를 만들기 전에 매번 ApplicationUser 객체를 검색 할 때 메모리/대역폭에 대해 걱정할 필요가없는 최소한의 메모리/대역폭이 사용 되었습니까?

미리 감사드립니다.

+1

해당 체크가 꽤 중요한 경우 (예를 들어, 변경 사항이 발생하면 변경 사항을 반영해야합니다) 그런 다음 그대로 두어야합니다. ** 그 많은 오버 헤드가 아닙니다. 솔직히. 중요하지 않은 경우 쿠키/세션/캐시에 저장해보십시오. – mattytommo

+0

.NET Framework의 'MemoryCache'클래스를 사용하여 사용자 조회를 데이터 캐시에 저장합니다. 원하는만큼 오랫동안 각 사용자 객체를 캐시하도록 구성 할 수 있으며 지속성 소스 (데이터베이스)에 대한 적중 횟수를 줄일 수 있습니다. –

답변

0

로그인 된 ID의 값을 가진 클레임을 추가하는 일반적인 경우입니다.

사용자가 로그인하면이 값으로 클레임을 추가합니다. 이 주장의 가치는 쿠키에 유지됩니다. 사용자가 돌아올 때마다 사용할 수 있으며 쿠키 인증을 위해 어쨌든 진행되는 매우 빠른 검색입니다.

는 신원이 주장을 추가하려면 ApplicationUserManagerCreateIdentityAsync 메서드를 재정의해야합니다

다음
public override async Task<ClaimsIdentity> CreateIdentityAsync(ApplicationUser user, string authenticationType) 
{ 
    var identity = await base.CreateIdentityAsync(user, authenticationType); 

    identity.AddClaim(new Claim("MyApplication:maxFiles", user.account.maxFiles)); 

    return identity; 
} 

이에 액세스 할 수는 확장 방법을 만들 수 있습니다

public static int GetMaxFiles(this IPrincipal principal) 
{ 
    if (principal == null) 
    { 
     throw new ArgumentNullException("principal"); 
    } 

    var claimsPrincipal = principal as ClaimsPrincipal; 
    if (claimsPrincipal == null) 
    { 
     throw new DomainException("User is not authenticated or IPrincipal is not ClaimsPrincipal"); 
    } 

    var claim = claimsPrincipal.Claims.FirstOrDefault(c => c.Type == "MyApplication:maxFiles"); 
    int maxfiles = 0; 
    if(int.TryParse(claim.Value, out maxfiles)) 
    { 
     return maxfiles; 
    } 
    throw new Exception("Claim value is not an integer") 
} 

을 그리고 응용 프로그램에서 var maxFiles = HttpContext.Current.User.GetMaxFiles()으로 사용할 수 있습니다. 또는 컨트롤러 또는보기 인 경우 var maxFiles = User.GetMaxFiles()을 수행 할 수 있습니다.

매우 빠른 조회이며 데이터베이스에 도달하지 못합니다.