ASP.NET MVC 中的动态操作筛选器

来源:互联网 发布:高尔夫视频分析软件 编辑:程序博客网 时间:2024/05/16 11:19

对于内容和功能常常变化的网站(主要是网站门户)和高度可自定义的软件即服务 (SaaS) 应用程序,任何可以避免触及源代码的解决方案都更受欢迎。 因此,问题是,如何动态加载操作筛选器? 答案是当然有,本文其余部分将对此进行说明。

深入了解 ASP.NET MVC

ASP.NET MVC 框架公开了大量接口和可重写方法,通过这些接口和方法,几乎可以对该框架的所有方面进行自定义。 简而言之,控制器方法的整个操作筛选器集合都加载并保存在驻留内存的列表中。 作为开发人员,您可以访问和检查该列表。 通过多做一些工作,您可以修改操作筛选器的列表,甚至可以动态填充该列表。

现在,我们概述一下框架为了执行操作所执行的步骤,深入了解相关工作原理。 在这个过程中,将使用可实现动态筛选器的中心组件:操作调用程序。

操作调用程序最终负责控制器类所有操作方法的执行。 操作调用程序实现每个 ASP.NET MVC 请求的内部生命周期。 调用程序是实现 IActionInvoker 接口的类的实例。 每个控制器类都有自己的调用程序对象,通过名为 ActionInvoker 的普通 get/set 属性对外公开。 该属性是在基 System.Web.Mvc.Controller 类型上定义的,如下所示:

  1. public IActionInvoker ActionInvoker {
  2. get {
  3. if (this._actionInvoker == null) {
  4. this._actionInvoker = this.CreateActionInvoker();
  5. }
  6. return this._actionInvoker;
  7. }
  8. set {
  9. this._actionInvoker = value;
  10. }
  11. }

因此,有两种方法可以向控制器实例动态添加筛选器:重写 GetFilters 和重写 InvokeActionMethodWithFilters。 但是,两者有什么区别?

操作生命周期

执行 GetFilters 或 InvokeActionMethodWithFilters 的过程大致相同。 确实存在一些区别,但区别无关紧要。 为了解两者之间的区别,我们仔细研究一下默认操作调用程序在执行操作方法时执行的步骤。 图 4 对生命周期进行了总结。

图 4 操作方法的生命周期

在获取描述符后,调用程序获取筛选器的列表并进入授权阶段。 此时,调用程序处理已注册的所有授权筛选器。 如果授权失败,任何操作结果的执行都完全忽略所有筛选器。

接下来,调用程序检查请求是否需要验证已发布数据,然后继续执行操作方法,并加载当前已注册的所有筛选器。

最后,如果要动态添加任何授权筛选器,只有通过 GetFilters 方法添加才会正常运行。 如果只是想添加操作筛选器、结果筛选器或异常筛选器,这两种方法的结果是一样的。

动态筛选器

动态加载筛选器是一项可选功能,主要适用于功能常变的应用程序。 通过筛选器(尤其是操作筛选器),开发人员可以以声明方式打开和关闭行为,从而在 ASP.NET MVC 控制器类中实现面向方面的功能。

在编写控制器类的源代码时,您可以选择向类或方法级别添加操作属性。 从外部数据源读取有关操作筛选器的信息时,可能并不清楚如何组织信息以清晰表示筛选器和对应的方法。 在数据库方案中,可以创建一个表,表中以方法和控制器名称为键。 在配置方案中,可能需要编写一个自定义配置节,只提供所需的信息。 在任何情况下,ASP.NET MVC 框架都非常灵活,您可以根据每个方法(甚至每个调用)来确定要应用的筛选器。

 

原文连接:http://msdn.microsoft.com/zh-cn/magazine/gg309182.aspx