Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么MVC基类的实现与WebForms截然不同?_C#_Asp.net_.net_Asp.net Mvc_Webforms - Fatal编程技术网

C# 为什么MVC基类的实现与WebForms截然不同?

C# 为什么MVC基类的实现与WebForms截然不同?,c#,asp.net,.net,asp.net-mvc,webforms,C#,Asp.net,.net,Asp.net Mvc,Webforms,从很长一段时间以来,我需要问一个不应该问的问题,但请把它放在人类的头上 为什么MVC对WebForms的服务器、响应等有不同的实现 MVC中的取决于: MVC会话HttpSessionStateBase->来自System.Web MVC服务器HttpServerUtilityBase MVC请求HttpRequestBase MVC响应HttpResponseBase MVC上下文HttpContextBase 但在网络表单中: WebForms会话HttpSessionState->来

从很长一段时间以来,我需要问一个不应该问的问题,但请把它放在人类的头上

为什么MVC对WebForms的服务器、响应等有不同的实现

MVC中的取决于:

  • MVC会话HttpSessionStateBase->来自System.Web
  • MVC服务器HttpServerUtilityBase
  • MVC请求HttpRequestBase
  • MVC响应HttpResponseBase
  • MVC上下文HttpContextBase
但在网络表单中:

  • WebForms会话HttpSessionState->来自System.Web.SessionState

  • HttpServerUtility

  • HttpRequest

  • HttpResponse

  • HttpContext

在MVC中,HttpContext也是控制器的一个属性。但是在WebForms中,HttpContext只是一个静态类

看起来MVC为WebForms one推出了包装器类?或者我不知道

HttpSessionStateWrapper

HttpContextWrapper

我只是想知道为什么所有这些东西都不同?编写库的专家是否会这样做,因为它们看起来不错而不是难看?

TL;DR

MVC确实使用了
HttpRequest
HttpContext
HttpResponse
,等等。它只是不直接使用它们

通过依赖于“基类”,它允许您替换从这些抽象类继承的您自己的实现。这使我们能够为依赖于上下文、请求等的控制器或其他类编写单元测试

在运行时,它接受
HttpRequest
并将其封装在名为的类中,该类也继承自
HttpRequestBase
,因为
HttpRequest
不继承自
HttpRequestBase
。(其他类的模式相同。)


从技术上讲,MVC在运行时使用与WebForms相同的类。这并不直接取决于他们。相反,它取决于基类。在运行时,它使用诸如
HttpContextWrapper
之类的包装类,这些包装类继承自基类,但实际上“包装”了
HttpContext
HttpRequest
等的实例

通过依赖抽象类(如
HttpContextBase
)而不是具体类(如
HttpContext
),MVC框架允许您通过提供抽象类的替代实现来“模拟”这些类。在那上面。这不是非常简单,但至少也不是不可能


相比之下,使用WebForms进行单元测试要困难得多。WebForms的大多数测试策略都涉及到尽可能避免使用WebForms,并将其放在其他可测试类中。但是当涉及到任何涉及请求、响应、上下文等的事情时,都很困难。显然是这样,但是你必须在你的页面中做一些奇怪的定制工作,而不是使用
上下文
页面
属性

但是。奇怪的是,实现是奇怪的!为什么在MVC中,HttpContext也是控制器的属性。但是在WebForms中,HttpContext只是一个静态类。