ASP.NET MVC中你必须知道的13个扩展点

ScottGu在其最新的博文中推荐了Simone Chiaretta的文章13 ASP.NET MVC extensibility points you have to know,该文章为我们简单介绍了ASP.NET MVC中的13个扩展点。Keyvan Nayyeri(与Simone合著了Beginning ASP.NET MVC 1.0一书)又陆续发表了一些文章,对这13个扩展点分别进行深入的讨论。我将在 以后的随笔中对这些文章逐一进行翻译,希望能对大家有所帮助。

ASP.NET MVC设计的主要原则之一是可扩展性。处理管线(processing pipeline)上的所有(或大多数)东西都是可替换的。因此,如果您不喜欢ASP.NET MVC所使用的约定(或缺乏某些约定),您可以创建自己的服务来支持您的约定, 并将其注入到主管线中。

在本文中,我们将从管线开始直到视图呈现, 逐一向您展示每个ASP.NET MVC开发者都必须了解13个扩展点。

1.RouteConstraint

通常情况下你可以使用正则表达式对url参数 进行约束,但如果您的约束不仅仅取决于单一参数,您可以实现 IRouteConstrains的方法,并在其中添加你的验证逻辑。

比如对日期的 验证,url中可能会包含年、月、日,而你需要验证这三者是否可以组合成一个 有效的日期。

2.RouteHandler

RouteHandler是在路由选择之后进 行处理的组件,它并不仅仅针对ASP.NET MVC。显然,如果您改变了 RouteHandler,那么对请求的处理将不再使用ASP.NET MVC,但这在您使用其他 HttpHandler或经典的WebForm进行路由处理时却是非常有用的。

3.ControllerFactory

ControllerFactory是基于路由的组件,它 选择正确的controller并对其实例化。default factory会查找实现了 IController并且以Controller结尾的类,然后通过反射使用无参构造函数进行 实例化。

但如果您希望使用依赖注入,就不能再使用default factory, 而必须使用支持IoC的controller factory。MvcContrib和Ninject Controller Factory都包含支持IoC容器的controller factory。

4.ActionInvoker

ActionInvoker顾名思义是负责调用(invoke) action的。默认的action invoker通过方法名、action名或其他可能的selector attribute来查找action,然后调用action方法以及定义的filter,最终执行得 到action result。

你会发现大部分执行管线存在于 ControllerActionInvoker类的逻辑之中。因此,如果希望改变这些约定,如 action方法的选择逻辑、http参数映射到action参数的方式、选择和执行filter 的方式等,您需要扩展该类并重写需要修改的方法。

可以参阅 NinjectActionInvoker I developed to allow injection of dependencies inside filters。

5.ActionMethodSelectorAttribute

使用默认 的action invoker时,action的选择是基于名称的。您也可以实现自己的Method Selector以改善对于action的选择。在框架中已经包含了AcceptVerbs特性,它 允许您指定使用哪一个HTTP Verb来处理action的响应。

例如,您也许会 希望基于浏览器所支持的语言或浏览器类型(如移动设备的浏览器或桌面浏览器) 来进行action的选取。

6.AuthorizationFilter

这种过滤器是在 action执行之前执行的,用来确保请求是有效的。

框架中已经包含了一 些autorization过滤器,最有名的莫过于Authorize特性,它用来检查当前用户 是否允许执行该action。另一个是用来阻止CSRF攻击的 ValidateAntiForgeryToken。如果您希望实现自己的authorization,那么必须 实现接口。例如,日期中的小时。

7.ActionFilter

Action Filters在action执行前后执行。OutputCache过滤器是几个核心过滤器之一。这 可能是您最有可能使用的扩展点,并且在我看来,controller只关心它的主要工 作,而view所需要的所有其他数据都必须从action过滤器内部获取,这样的实现 对于一个组织良好的view来说,是十分关键的。

时间: 2024-12-29 17:42:10

ASP.NET MVC中你必须知道的13个扩展点的相关文章

如何在 ASP.NET MVC 中集成 AngularJS(3)

今天来为大家介绍如何在 ASP.NET MVC 中集成 AngularJS 的最后一部分内容. 调试路由表 - HTML 缓存清除 就在我以为示例应用程序完成之后,我意识到,我必须提供两个版本的路由表:一个运行在调试模式的应用程序下和一个运行在发布模式的应用程序下.在调试模式下,JavaScript 文件在未使用压缩功能的情况下会被下载.如果想要调试并在 JavaScript 控制器中设置断点,这是必须的.事实上,路由表的产生版本也出现了一些挑战,由于产生路由代码使用的是 JavaScript

你必须知道的.NET

[你必须知道的.NET]第三十五回,判断dll是debug还是release,这 [你必须知道的.NET]第三十四回,object成员,不见了! [你必须知道的.NET]第三十一回,深入.NET 4.0之,从"新"展望 [你必须知道的.NET]第三十三回,深入.NET 4.0之,Lazy<T> [你必须知道的.NET]第三十二回,,深入.NET 4.0之,Tuple一二 [你必须知道的.NET]第三十回:.NET十年(下) [你必须知道的.NET]第二十九回:.NET十年(

[你必须知道的.NET]第二十七回:interface到底继承于object吗?

说在,开篇之前 在.NET世界里,我们常常听到的一句话莫过于"System.Object是一切类型的根,是所有类型的父类",以至于我在<你必须知道的.NET>8.1节 以"万物归宗:System.Object"这样的title为System.Object授予至高荣誉.所以,基于这样的观点就有了下面这句"接口是否也继承于System.Object?",事实上这正是今天在技术群里小小讨论的一个插曲. 1 缘起 在.NET世界里,我们常常听

[你必须知道的.NET]第二十四回:认识元数据和IL(上)

说在,开篇之前 很早就有说说Metadata(元数据)和IL(中间语言)的想法了,一直在这篇开始才算脚踏实地的对这两个阶级兄弟投去些细关怀,虽然来得没有<第一回:恩怨情仇:is和as>那么迅速,但是Metadata和IL却是绝对重量级的内容,值得我们在任何时间关注,本文就是开始. 1 引言 你可曾想到,我们的C#代码,编译之后究竟为何物?你可曾认知,我们的可执行程序,运行之时的轨迹究竟为哪般?那么,本文通过对Metadata(元数据)和IL(Intermediate Language, 中间语

[你必须知道的.NET]第二十二回:字符串驻留(上)---带着问题思考

走钢丝的人,在刺激中体验快感.带着问题思考,在问题上迸发火花. 或者给问题以答案,或者给答案以问题,你可能永远无法看清全部,但是总能从一点突破很多.事实的关键就在于面对问题,我该如何思考? String Interning(字符串驻留)就是这样一个值得思考的话题,带着问题思考,我们至少要理清以下几个问题: 什么是string? 什么是字符串驻留? 字符串驻留的运行机制及执行过程? 字符串驻留的其他问题? 带着几个问号,你必须知道的.NET,继续更多体验. 1 带着问题? 带着问题思考,是技术探索

[你必须知道的.NET]第二十回:学习方法论

说在,开篇之前 本文,源自我回答刚毕业朋友关于.NET学习疑惑的回复邮件. 本文,其实早计划在<你必须知道的.NET>写作之初的后记部分,但是因为个中原因未能如愿,算是补上本书的遗憾之一. 本文,作为[<你必须知道的.NET>]系列的第20回,预示着这个系列将开始新的征程,算是[你必须知道的.NET]2.0的开始. 本文,作为一个非技术篇章,加塞儿到<你必须知道的.NET>队伍中,我想至少因为回答了以下几个必须知道的非技术问题:.NET应该学习什么? .NET应该如何学

[你必须知道的.NET]第十四回:认识IL代码---从开始到现在

本文将介绍以下内容: ·IL代码分析方法 ·IL命令解析 ·.NET学习方法论 1.引言 自从『你必须知道.NET』系列开篇以来,受到大家很多的关注和支持,给予了anytao巨大的鼓励和动力.俱往昔,我发现很多的园友都把目光和焦点注意在如何理解IL代码这个问题上.对我来说,这真是个莫大的好消息,因为很明显我们的思路慢慢的从应用向底层发生着转变,技巧性的东西是一个方面的积累,底层的探索在我认为也是必不可少的修炼.如果我们选择了来关注这项修炼,那么我们就应该选择如何来着手这项修炼,首先关注anyta

[你必须知道的.NET] 第五回:深入浅出关键字---把new说透

相关文章: [你必须知道的.NET] 第三回:历史纠葛:特性和属性 [你必须知道的.NET] 第四回:后来居上:class和struct 本文将介绍以下内容: 面向对象基本概念 new关键字深入浅出 对象创建的内存管理 1.引言 园子里好像没有或者很少把new关键字拿出来说的,那我就占个先机吧,呵呵.那么,我们到底有必要将一个关键字拿出来长篇大论吗?看来是个问题.回答的关键是:你真的理解了new吗?如果是,那请不要浪费时间,如果不是,那请继续本文的循序之旅. 下面几个 问题可以大概的考察你对ne

[你必须知道的.NET] 第二回:对抽象编程:接口和抽象类

相关文章: [你必须知道的.NET] 第三回:历史纠葛:特性和属性 [你必须知道的.NET] 第四回:后来居上:class和struct 1. 引言 在我之前的一篇post<抽象类和接口的谁是谁非>中,和同事管伟的讨论,得到很多朋友的关注,因为是不成体系的论道,所以给大家了解造成不便,同时关于这个主题的系统性理论,我认为也有必要做以总结,因此才有了本篇的新鲜出炉.同时,我将把上贴中的问题顺便也在此做以交代. 2. 概念引入 什么是接口? 接口是包含一组虚方法的抽象类型,其中每一种方法都有其名称