C# 为什么MVC基类的实现与WebForms截然不同?
从很长一段时间以来,我需要问一个不应该问的问题,但请把它放在人类的头上 为什么MVC对WebForms的服务器、响应等有不同的实现 MVC中的取决于: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会话HttpSessionStateBase->来自System.Web
- MVC服务器HttpServerUtilityBase
- MVC请求HttpRequestBase
- MVC响应HttpResponseBase
- MVC上下文HttpContextBase
- WebForms会话HttpSessionState->来自System.Web.SessionState
- HttpServerUtility
- HttpRequest
- HttpResponse
- HttpContext
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只是一个静态类。