[ASP.NET]分析MVC5源码,并实现一个ASP.MVC
本节内容不是MVC入门教程,主要讲MVC原理,实现一个和ASP.NET MVC类似基本原理的项目.
MVC原理是依赖于ASP.NET管道事件基础之上的.对于这块,可阅读上节内容
本节目录:
- MVC简介
- MVC5源码
- 实现一个MVC
MVC简介
随着技术的发展,现在已经将MVC模式等同于三层模式。
如果要严格区分的话,UI层指View和Controller,BLL,DAL层和模型层都属于Model中。
在建立MVC项目的时候,选择空的项目,会建立一个如下的项目结构
由于MVC具有以下优点
- 性能高,不需要经过复杂的控件生命周期
- SEO,页面干净,没有ViewState,url地址没后缀名
- 扩展多,ActionResult各种子类,轻松返回JSON,string
- Razor视图引擎
- ....
所以MVC不得不成为ASP.NET的首选开发
扩展
Action的本质就是方法,只要是public的方法,外部都能访问到
MVC原理
路由系统
类图
代码图
路由对象
路由系统
RouteTable
路由表,有个RouteDictionary属性,存放RouteBase的实现类Route。通过Route能返回RouteData.
RouteData中包括
路由系统原理
首先添加一条路由对象,路由对象相当于定制一个url模板
然后创建一个Controller工厂,用来反射调用Controller方法,并缓存所有Controller Type,将其赋值给ControllerBuilder,这个是一个单例对象.
UrlRoutingModule
注册第7个事件,并且根据HttpContext(实际就是读取URL),从RouteTable中获取到RouteData,
然后通过RouteData获取IHttpHandler
扩展:
路由系统依赖UrlRoutingModule,而这个在默认配置的Web.config中已经配置,所以路由并不是ASP.Net MVC专属,而是Asp.Net必经之路.
ActionResult
我们的Action实际上就是返回一个ActionResult.
实际上ActionResult是HttpHandle中PR方法最终输出也是最核心的方法.
这里看下ActionResult源码和JsonResult源码
1 2 3 4 |
public abstract class ActionResult
{
public abstract void ExecuteResult(ControllerContext
context);
}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public class JsonResult
: ActionResult
{
public object Data
{ get ; set ;
}
public JsonRequestBehavior
JsonRequestBehavior { get ; set ;
}
public JsonResult()
{
this .JsonRequestBehavior
= JsonRequestBehavior.DenyGet;
}
public override void ExecuteResult(ControllerContext
context)
{
JavaScriptSerializer
scriptSerializer = new JavaScriptSerializer();
if ( this .MaxJsonLength.HasValue)
scriptSerializer.MaxJsonLength
= this .MaxJsonLength.Value;
if ( this .RecursionLimit.HasValue)
scriptSerializer.RecursionLimit
= this .RecursionLimit.Value;
response.Write(scriptSerializer.Serialize( this .Data));
}
}
|
MVC请求流程
- 到达URLModule的第7个Application事件
- 首先根据URL,找到并创建MVCHandle(继承IHttpHandle),
- 映射IHttpHandlehttpContext.RemapHandler(handler)
- 在第11个Application事件后,执行MVCHandle的PR方法
- 根据URL,创建指定Controller(继承Controller,ControllerBase,IController),调用IController的Execute的方法.
- 在ControllerBase的Execute方法的调用抽象方法ExecuteCore
- 在Controller的ExecuteCore方法调用ActionInvoker(这个属性实现类是ControllerActionInvoker)的InvokeAction方法
- 执行MVC过滤器
- 调用控制器的方法,得到ActionResult
- 调用ActionResult的ExecuteResult方法
- Response输出
IController
1 2 3 4 |
public interface IController
{
|