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来说,是十分关键的。