摘要:
一. 元数据描述类型ModelMetadata模型元数据是对Model的描述信息,在ASP.NET MVC框架中有非常重要的作用,在模型绑定,模型验证,模型呈现等许多地方都有它的身影。描述Model元数据的基本类型是ModelMetadata,日常开发中我们建立的ViewModel,在上面的声明的许... 阅读全文
摘要:
这一节我们关注模型绑定的值提供体系,先来介绍几个重要的接口一.IValueProvider,接口定义如下:1 public interface IValueProvider2 {3 4 bool ContainsPrefix(string prefix);... 阅读全文
摘要:
当我们在Controller中定义一个Action,通常会定义一个或多个参数,每个参数称为一个模型,ASP.NET MVC框架提供了一种机制称为模型绑定,会尝试自动从请求的信息中实例化每一个模型并赋值。这其中又涉及模型的元数据提供和模型的验证。 我们不妨试想一下,如果来定义一种从字符串值到对象... 阅读全文
摘要:
前面我们介绍了Filter的基本使用,但各种Filter要在合适的时机运行起来,需要预先准备好,现在看看ASP.NET MVC框架是怎么做的。一.Filter集合 在ControlerActionInvoker的InvokeAction方法中,只有一行代码FilterInfo filterIn... 阅读全文
摘要:
Filter是ASP.NET MVC框架提供的基于AOP(面向方面)设计,提供在Action执行前后做一些非业务逻辑通用处理,如用户验证,缓存等。现在来看看Filter相关的一些类型信息。一.基本类型1. Filter类型,描述筛选器信息的元数据类型,具体定义如下: 1 public cla... 阅读全文
摘要:
一. ControllerDescriptor说明 ControllerDescriptor是一个抽象类,它定义的接口代码如下:public abstract class ControllerDescriptor : ICustomAttributeProvider, IUniquelyIdentifiable { public abstract ActionDescriptor FindAction(ControllerContext controllerContext, string actionName); public v... 阅读全文
摘要:
在开始之前,声明一下,由于ASP.NET MVC5正式发布了,后面的分析将基于ASP.NET MVC5最新的源代码。在前面的内容我们分析了怎样根据路由信息来确定Controller的类型,并最终生成Controller的实例。这一节来了解一下Controller的总体执行分析,以同步执行版本为主。Controller的继承体系如下图所示: 当调用Controller实例的Excecute方法时,实际是调用ControllerBase的Excecute方法,该方法的主要实现代码如下: 1 protected virtual void Execute(RequestContext reque... 阅读全文
摘要:
一. 为什么要进行扩展 在前面的分析中,我们知道默认的Controller激活系统只能实例化无参构造函数的Controller类型,但在某些情况一下,我们希望某些服务的实例能够自动注入到Controller实例中,从而达到服务接口和实现的隔离,减小重复的代码,提高系统的可维护性和灵活性。也就是说我们希望在Controller激活中引入依赖注入。关于依赖注入的概念这里就不解释了,请自行查询相关的资料。基于.net依赖注入框架也有很多,下面的例子主要使用微软企业库的Unity。 在上一节的分析中,我们知道Controller的激活实际是包括获取IControllerFacotry和IContr.. 阅读全文
摘要:
一. 高层相关类说明 当路由系统根据请求Url收集路由信息后,下一步就要将路由信息传给Controller激活系统,Controller激活系统负责实现了IController接口的Controller类实例化。它的相关类族体系如下图所示:MvcHandler实现了IHttpHandler,IHttpAsyncHandler,IRequiresSessionState三个接口,其中IHttpHandler,IHttpAsyncHandler分别是HttpHandler同步与异步的实现,IRequiresSessionState是个标记接口,表示需要Session支持.IController,. 阅读全文
摘要:
一.路由实现 路由系统实际是一个实现了ASP.NET IHttpModule接口的模块,通过注册HttpApplication的PostResolveRequestCache 事件对Url路由处理.总体框架代码如下所示: foreach(路由规则 in 路由表) { if (当前路由规则匹配请求Url) { 1.获取路由处理IRouteHandler 2.从RouteHandler中获取HttpHandler 处理请求 } } 路由系统实现分为两个部分,一个是ASP.NET标准的模块,在System. Web.dll 程序集System.Web.... 阅读全文