MVC框架三大模块

1.Routing模块

Routing机制与MVC5的URL解析处理流程基本是相同的,很多的接口和类像IRouteHandler、IHttpHandler、IController 、RouteBase、RouteTable、RouteDictionary、DefaultControllerFactory以及AreaRegistration名称是相同的功能是类似的,也可以是看做MVC5路由机制的简化版本或者是Artech MVC5书中路由实例的强化版本。在Web项目的启动阶段,设置的路由模板(包括AreaRegistration中的)会被注册到RouteDictionary中,AppDomain中所有实现了IController接口的类型都会被注册到一个线程安全的集合中。

需要重点说明的时候,结合公司现有项目的实战经验(公司的开发规范),MVC项目的路由模板是很正规的,只能是这种形式Area/{otherParameter}/{controller}/{action}/{id},一个Segment只能是”/”或者纯文本字符串或者就单纯是一个大括号参数,不能即有参数又有文本字符串类似”/{date}text{time}/”或者”/{*parameter}/{ohterParameter}/”等等会造成路由复杂的特性(也不能使用RouteAttribute)。也无需RouteConstraint。所以我在解析请求的Url的工作量也降低了不少。

通过遍历缓存的Route集合,以Request作为参数,调用Route的Match方法,对比每个Route中的UrlTemplate和请求Url的虚拟路径,在文本字符串相同,参数位置相符的情况下将请求Url的对应结果或者Route中的默认参数值保存到RouteData的Values字典属性中。在解析出Area,Controller还有Action之后会调用DefaultControllerFactory,依据所匹配Route的DataTokens字典中存储的命名空间还有在项目中配置的默认命名空间来找到满足命名空间还有Controller名的Type。实例化并执行。

2.Action的参数绑定及执行

Action参数配置了五个来源分别是RouteData,QueryString,FormValue,FileCollection还有一个JsonValue,在执行参数绑定的时候,依优先级顺序获取用户指定的特定参数类型的绑定,如果未设置则调用DefaultModelBinder作为默认的绑定。DefaultModelBinder实施绑定还是相当复杂的难以讲述,同时在绑定的过程中还会执行ModelValidator,更新ModelState,总体而言,DefaultModelBinder会判断Action的参数是简单类型还是复杂类型,如果是复杂类型会使用反射解析出所有属性递归调用直到分解成所有简单类型执行绑定,所有复杂类型所分解出的属性会以字符串表达式()的形式传入那五个数据源来匹配是否有值,如果有就更新到ModelState。在表单中有时候需要上传文件,看到Nancy MVC框架中有套文件上传机制是通过解析Header中的boundary Token来获得文件Stream的就修改部分功能,并替换掉上下文然后加入到DrisionMVC中。

在完成参数的绑定后就开始执行Action的真正逻辑了,DrisionMVC为了提高效率,所有的Action都是以Action的MethodInfo为Key包装Action的ActionMethodDispatcher为Value,保存到一个线程安全的ActionMethodDispatcherCache字典中的,ActionMethodDispatcher的Execute方法会完成真正的逻辑执行,Action会被包装到一个LamdaExpression中,形式为Func<object, object[], Task<object>>,该LamdaExpression同样会被缓存,被获取执行就能返回正确的结果。

3.视图cshtml文件的编译执行

View视图文件的编译参照的是RazorEngine框架,所有的.cshtml文件在被第一次编译成C#类后都会被保存到一个线程安全的字典中。该框架的大体运行流程是在控制器的Action方法中返回View()时会调用ViewResult类的ExecuteResult方法,该方法体中开始调用RazorEngine的编译和执行功能,根据约定获取到视图.cshtml文件的绝对路径,以该绝对路径和视图Model的类型(不存在就为null)为组合key,查找缓存中是否存在已经编译好的视图实例,存在就直接返会视图实例,执行视图实例返回一个完整的html字符串文本并写入到Response的Body属性中。如果不存在就会首先获取到.cshtml文件的全部文本,同时新建一个TypeContext的实例包含,Model的Type类型,还有被编译生成的C#类的基类RazorTemplateBase<>还有所必需的的命名空间集合。传入Roslyn编译器生成真正的C#类型并保存。不过现在还有一个问题就是在视图cshtml中应用了@model ModeType之后调用@Html.TextBoxFor等等空间的时候没有智能提示也是挺头疼的,目前暂时使用@inherits来替代。

开发的过程中发现RazorEngine并没有@Html(HtmlHelper)和@Url(UrlHelper)的帮助类,所以在使用DrisionMVC开发Web项目就无法使用控件了,像@Html.TextBox,@Html.DropdowList,@Html.Action还有@Url.Action之类的。所以在RazorTemplateBase<>基类中自定义了HtmlHelper,还有UrlHelper两个属性,所有控件的Render机制都与MVC5只是修改成使用OwinContext作为数据源。另外子Action机制还有Partial也是比较复杂的,花了不少的精力。View视图的两大重量级的控件DisplayFor,EditorFor因为公司里面项目都为使用所以未添加。

经过几个月的奋战终于完成了这套MVC框架,在测试应用的过程中问题很少并且没有出现架构级的错误造成某些MVC5常用功能无法实现,也是倍感欣慰。感觉学到了很多的东西,高内聚松耦合的思想也是颇有体会,也学习了不少框架开发的注意事项。

时间: 2025-01-11 18:54:32

MVC框架三大模块的相关文章

MVC框架浅析(基于PHP)

MVC框架浅析(基于PHP) MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面 显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑.MVC被独特的发展起来用于 映射传统的输入.处理和输出功能在一个逻辑的图形化用户界面的结构中. 一.MVC概念 MVC 是一种使用 MVC(Model View Contr

.Net MVC 框架基础知识

一.什么是MVC? MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式. MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写, 一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑.MVC被独特的发展起来用于映射传统的输入.处理和输出功

开发自己的PHP MVC框架(一)

这个教程能够使大家掌握用mvc模式开发php应用的基本概念.此教程分为三个部分.如今这篇是第一部分. 如今市面上有非常多流行的框架供大家使用.可是我们也能够自己动手开发一个mvc框架.採用mvc模式能够大大降低我们开发应用的时间,并且能够更好的组织项目源码,并且当中的某些模块还可在其他项目中使用.如今我要教大家写一个简单的mvc框架.因为这个项目非常easy,轻量.所以可能并非最佳实践,也不具备安全性.还须要大家在实际应用中完好. 所用技术:php,面向对象开发方法. 開始 首先在站点根文件夹下

ASP.NET MVC框架下添加菜单栏及分页项目

原创声明:本文为作者原创,转载请注明出处:http://www.cnblogs.com/DrizzleWorm/p/7274866.html ,谢谢! 我是做前端开发的,之前用C#的三层架构(UI.BLL.DAL)做过一个网站,这是我第一次接触ASP.NET MVC框架,首先给大家分享别人整理的ASP.NET MVC框架的一组教程:http://www.cnblogs.com/powertoolsteam/archive/2015/08/13/4667892.html内容很齐全,我是在先看了其他

030.自定义的MVC框架

.LOG自定义的MVC框架 M: Model模型V: View 视图C: Controller 控制器 ASP.Net 1. Web窗体编程2. Mvc编程 IHttpHandler任何处理web请求的类必须实现此接口void ProcessRequest(HttpContext context)bool IsReuseable{get;} 使用IHttpHandler实现登录与注册1.新建UserHandelr:IHttpHandler接口2.web.config配置,处理 /user.do请

MVC框架

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑.MVC被独特的发展起来用于映射传统的输入.处理和输出功能在一个逻辑的图形化用户界面的结构中. 外文名 MVC框架 全    名 Model View Controller 产生时间 1982年 架构内容

Spring MVC 简述:从MVC框架普遍关注的问题说起

任何一个完备的MVC框架都需要解决Web开发过程中的一些共性的问题,比如请求的收集与分发.数据前后台流转与转换,当前最流行的SpringMVC和Struts2也不例外.本文首先概述MVC模式的分层思想与MVC框架普遍关注的问题,并以此为契机结合SpringMVC的入门级案例简要地从原理.架构角度介绍了它对这些问题的处理,包括请求处理流程.消息转换机制和数据绑定机制等核心问题.最后,本文对目前最为流行的两个MVC框架SpringMVC 和 一. MVC 模式与框架 1.MVC 模式 Java We

结合《需求征集系统》谈MVC框架

结合<需求征集系统>分析MVC框架. 六个质量属性: 可用性:在系统压力过大时,会提示系统繁忙. 可修改性:使用配置文件,修改配置文件即可.对于一些公共的方法,进行封装,修改时,只需修改封装的方法,不必修改调用方法的代码. 性能:提高系统响应时间,不让用户感到延迟. 安全性:对密码等信息进行MD5加密存储. 可测试性:使用Junit进行单元测试. 易用性:在填报需求时填入登录用户已有的信息,用户校验提醒,多种方式查询. 具体功能模块分析: 需求查询模块:使用mvc方式实现. model:从数据

分享一实战性开源MVC框架&lt;Linux、Windows跨平台开发so easy&gt;

一.引子   开源地址 http://pan.baidu.com/s/1slCMspR .NET Core微软还在发力,但作为商用还有一段距离,很多开发库尚不能用于.NET Core,因此我们还没有看到一个大型的使用案例, 这时大家或许想到Mono部署ASP.NET MVC,但部署过的人必然知道:这不是一个容易的工作,需要各种工作,至今也没有几个人容易地完成这项工作. .NET Core作为微软的新星,但还不够成熟强大,在其发出耀眼光辉之前,我们分享一实战性强的开源MVC框架: Moon.Mvc