Я хочу иметь возможность доступа к пользовательским свойствам для аутентифицированного пользователя, такого как UserId и FirstName, не запрашивая базу данных каждый раз.Я нашел этот сайт в сообщении о переполнении стека, и мне нравится этот подход, но я использую IoC / репозитории и решил не пытаться заставить global.asax взаимодействовать с базой данных, опасаясь, что он будет несовместим.с шаблоном хранилища.
Вместо этого я создал интерфейс для CustomPrincipal и использую IoC (Castle) для создания экземпляра и передачи его контроллерам (а затем и моему базовому контроллеру).
Базовый контроллер используетметоды, которые я создал в CustomPrincipal, чтобы выполнить ту же задачу, к которой автор блога обратился в global.asax.А именно, CustomPrincipal инициализируется из базы данных или кэша и назначается HttpContext.Current.User.
Мои контроллеры / представления могут затем ссылаться на свойства следующим образом ...
((ICustomPrincipal)(HttpContext.Current.User)).FirstName;
Это работает, но я чувствую некоторые запахи кода.Прежде всего, если я ссылаюсь на HttpContext с контроллеров, я убил свое модульное тестирование.Я думаю о том, чтобы изменить свой объект CustomPrincipal, чтобы он возвращал указанное выше значение (чтобы я мог его смоделировать в своих модульных тестах), но мне интересно, если это обходной путь, а не хорошее решение.
AmЯ иду об этом правильным путем?Могу ли я сделать небольшие изменения, чтобы сделать его надежным решением, или я должен начать с нуля с FormsAuthenticationTicket или что-то в этом роде?
Спасибо!