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