2

Я разрабатываю интернет-приложение MVC 5 и задаю вопрос о том, что пользовательский объект находится в объекте ApplicationUser.MVC 5 - получение объекта ApplicationUser

У меня есть объект public virtual Account account в объекте ApplicationUser, который содержит множество максимальных переменных count для объектов в моем приложении MVC 5. Это устанавливается для каждого пользователя, когда пользователь регистрирует учетную запись.

Прежде чем я создам объект модели, я проверяю, не превысил ли пользователь максимальный счетчик для объекта модели. Это делается в классе сервиса для объекта.

Вот пример кода, используемый для объекта файла:

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

Если эта проверка является довольно критической (т. Е. Если она изменяется, вам нужно отражать изменения по мере их возникновения), то я бы сказал, что придерживайтесь ее как есть, это не так, что ** много накладных расходов Если честно. Если это не критично, подумайте о сохранении его в файле cookie/session/cache для более быстрого поиска. – mattytommo

+0

Я использую класс 'MemoryCache' в .NET Framework для кэша данных для моих пользователей. Вы можете настроить его, чтобы кэшировать каждый пользовательский объект столько, сколько захотите, и это уменьшит количество обращений к вашему источнику персистентности (базе данных). –

ответ

0

Это типичный случай для добавления претензии со значением для зарегистрированного идентификатора.

Когда пользователь регистрируется, вы добавляете требование с этим значением. Значение этого требования затем сохраняется в файле cookie. И доступен каждый раз, когда пользователь возвращается, и это очень быстрый поиск, который все равно происходит для аутентификации cookie.

Чтобы добавить это требование к личности, вам необходимо переопределить CreateIdentityAsync метод на ApplicationUserManager:

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().

Это очень быстрый поиск и не попадает в вашу базу данных.

Смежные вопросы