实现前端控制器模式

Implementing Front Controller pattern

几天来,我一直在尝试在基于 VBScript(ASP 经典)的系统上实现前端控制器。我来自 ASP.NET MVC 和 Java 背景,其中 MVC 实现很常见并且主要由现有框架完成。然而,在 VBScript 上,这方面几乎没有做任何事情,所以这就是我尝试自己做的原因。我使用 this and this 文章作为实施指南。

起初我认为我需要为每个请求定义一些常量参数,所以我创建了 3:

class_command  'which command responsible to execute the correct class handler
action         'which method of the class handler to execute
action_params  'which parameters the action will need

接下来,我定义了一个通用控制器处理程序来处理请求:

Public Function Controller_Handler(action_params) 

它的任务是提取常量参数(class_commandactionaction_params)并处理可能出现的任何错误(稍后我将添加一个过滤器来处理它)就像缺少常量参数或身份验证问题一样。

但很快我就意识到了一个问题:既然请求是一个字符串,处理程序如何知道要调用哪个命令?我不能简单地将它转换为 class 使用反射,因为 VBScript(我认为)没有反射库或内置功能。

所以我想我可以像这样创建一个 Switch Case

Select action_Params.Item("action_params")
  Case "command_A"
    ' Call Command A
  Case "command_B"
    ' Call Command_B
   .
   .
   .
  Case "Command_X"
    ' And so on
End Select

但这有点程序化。接下来我想创建一个 XML 文件来映射所有命令和其他内容。

所以我的问题是:考虑到 VBScript 的限制,这是实现 Front Controlller 模式的好方法吗?如果没有,您能否提供有关如何操作的指导(希望有一些示例,即使是简单的示例)?

从 classic 移动到 .net/mvc 我可以分享我在 classic asp 中所做的,以尝试尽可能接近地模拟这种行为,而不需要这太维护问题了。

  1. 使用URL在IIS中重写是我的routes。我通常只创建一个路由,direct/rewrite 所有入站请求到一个 controller.asp 页面以简化事情,并且没有一堆规则和控制器直接在我的 URL 中重定向重写设置以使其更容易维护(对我来说)。

  2. controllers.asp 中使用 Request.ServerVariables("HTTP_X-ORIGINAL-URL") 你可以获取实际输入的 URL,return 类似.. /real/url

  3. controllers.asp 中使用 Server.Execute("view1.asp")

  4. 根据输入的 url 以编程方式调用视图
  5. 我有一个名为 routes.asp 的 class 文件,它包含在每个 model/class 文件中,帮助我收集 URL 属性 oRoute.GetPath_FirstDirectory() 等等。然后 model/class 文件使用此数据创建其 属性 值,视图可以使用这些值。在每个 model/class 中使用 CLASS_INITIALIZE 从 route/url 填充自身,或者也可以直接在视图中完成。

  6. 在各自的视图中,我使用 <!--#include file="class.asp"--> 包含我的 class/model 文件(如果需要的话),然后只需打开 Set Model = new cModelClass 进行初始化并开始在看法。我没有在 controllers.asp 中包含 class,因为在对视图使用 Server.Execute() 时,视图不会继承 controllers.asp 的任何变量。所以我include它直接在视图中。

此处的错误处理可以在多个级别进行,但最好在 controllers.asp 中进行。特定的错误处理通常是在实际的 model/class CLASS_INITIALIZE 以避免在控制器中冗余使用 class,因为它已经在视图中初始化。

现在这并不是 .Net mvc 中的内容,但这是我想出的最好的方法,对我来说也是最容易维护的。也许其他人有其他实现,但这是我的,完全基于我的经验。到目前为止,一切进展顺利。