Почему базовые классы MVC имеют совершенно иную реализацию, чем WebForms? - PullRequest
0 голосов
/ 26 апреля 2019

С течением времени мне нужно задать вопрос, который не должен быть, но, пожалуйста, порадуйте людей вещами.

Почему MVC имеет другую реализацию для сервера, Respone и т. Д., Что WebForms?

В MVC зависит от:

  • MVC Session HttpSessionStateBase -> из System.Web
  • MVC Server HttpServerUtilityBase
  • Запрос MVC HttpRequestBase
  • MVC Respone HttpResponseBase
  • Контекст MVC HttpContextBase

Но в WebForms:

  • Сеанс WebForms HttpSessionState -> пришел из System.Web.SessionState

  • HttpServerUtility

  • HttpRequest

  • HttpResponse

  • HttpContext

Также в MVC HttpContext является свойством контроллера. но в WebForms HttpContext - это просто статический класс.

Похоже, MVC поставил классы Wrappers для WebForms? или не знаю.

HttpSessionStateWrapper

HttpContextWrapper

Мне просто интересно, почему все эти вещи разные? Неужели специалисты, которые пишут библиотеки, делают это так, как это выглядит неплохо, не страшно?

1 Ответ

1 голос
/ 26 апреля 2019

TL; DR

MVC делает использование HttpRequest, HttpContext, HttpResponse и т. Д. Он просто не использует их напрямую .

В зависимости от «базовых» классов это позволяет вам заменять ваши собственные реализации, которые наследуются от этих абстрактных классов.Это позволяет нам писать модульные тесты для контроллеров или других классов, которые зависят от контекста, запроса и т. Д.

Во время выполнения он занимает HttpRequest и упаковывает его в класс с именем HttpRequestWrapperкоторый также наследуется от HttpRequestBase, поскольку HttpRequest не наследуется от HttpRequestBase.(И тот же шаблон для других классов.)


Технически MVC использует те же классы, что и WebForms во время выполнения.Это просто напрямую не зависит от них.Вместо этого это зависит от базовых классов.Во время выполнения он использует классы-оболочки, такие как HttpContextWrapper, которые наследуются от базового класса, но на самом деле "обертывают" экземпляр HttpContext, HttpRequest и т. Д.

В зависимости от абстрактных классов, таких как HttpContextBaseв конкретных классах, таких как HttpContext, инфраструктура MVC позволяет «макетировать» эти классы, предоставляя альтернативные реализации абстрактных классов. Вот популярный ответ на это.Это не очень просто, но, по крайней мере, не невозможно.

В отличие от модульного тестирования было гораздо сложнее с WebForms.Большая часть стратегии тестирования для WebForms заключалась в том, чтобы сохранить как можно больше от них и поместить их в другие тестируемые классы.Но когда дело касалось чего-либо, связанного с запросом, ответом, контекстом и т. Д., Это было сложно.Очевидно, что не было невозможно , но вы должны были сделать некоторые странные пользовательские вещи на своих страницах вместо использования свойств Context или Page.

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