Контроллер передает пользовательскую информацию или использует HttpContext.User? - PullRequest
0 голосов
/ 29 ноября 2009

Я недавно задал вопрос об использовании Page.User или HttpContext.Current.User в представлении. Было рекомендовано вместо этого передать информацию о пользователе через контроллер? Я видел это и в другом опубликованном ответе.

Почему рекомендуется передавать информацию о пользователе через контроллер и не использовать Page.User или HttpContext.User?

Ответы [ 3 ]

1 голос
/ 29 ноября 2009

Это было бы прагматично только в том случае, если вы автоматизировали тестирование представлений с помощью Selenium или использовали какой-либо другой инструмент для проверки вывода HTML.

Если это так, то использование HTTPContext внутри ваших контроллеров, вероятно, очень плохая идея, потому что это только увеличит связь между действиями вашего контроллера и HTTPContext.

Чтобы получить максимальную тестируемость, вы, вероятно, захотите настроить фабрику контроллеров, которая может вставлять биты пользователя в ваш контроллер при вызове MVC. Таким образом, ваши методы действий остаются отделенными от HTTPContext, и вы получаете тестируемость.

Если вы не используете инструмент автоматического тестирования представлений, на самом деле не имеет значения, если вы вызываете информацию из HttpContext.User, если вы не выполняете много логики в своем представлении. Например, если (HttpContext.User.IsAuthenticated) или что-то. Если это так, вы можете просто вставить его в элемент управления и использовать RenderPartial или запекать логические биты в своих моделях представления.

Рекомендованный лучший метод для MVC - сохранять ваши Представления настолько глупыми, насколько это возможно. Тем не менее, я бы посоветовал не впадать в догматику по поводу MVC и паттернов, а что нет. Поскольку MVC не запекся в функциональности SubController, во многих областях нарушение шаблона MVC не только поощряется, но и не может быть нарушено иначе. (см. MVC 2 RenderAction, RenderPartial, MasterPages с элементами управления)

0 голосов
/ 29 ноября 2009

Контроллер должен предоставить все необходимые данные для просмотра. Это делает взгляды более тестируемыми. Если вы используете только вид модели изнутри, вы можете легко написать тест:

  1. Создание модели представления.
  2. Создать объект просмотра.
  3. Передайте модель для просмотра.
  4. Визуализация.
  5. Проверьте правильность результата.

Если вы используете HttpContext.Current внутри представления, вам придется сначала настроить его в своих тестах, что может быть непросто и добавит дополнительные зависимости.

0 голосов
/ 29 ноября 2009

Это ослабляет связь между вашим контроллером и другими классами в приложении. Используя больше паттернов внедрения зависимостей, вы можете повысить тестируемость контроллера. Это потому, что в ваших тестах вам не нужно имитировать такие понятия, как HttpContext, а просто передать пользовательский объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...