实现前端控制器模式



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

一开始我认为我需要为每个请求定义一些常量参数,所以我创建了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_command, action, action_params)并处理任何错误(稍后我将添加一个过滤器来处理它),这些错误可能像缺少常数参数或身份验证问题。

但很快我意识到一个问题:处理程序如何知道调用哪个命令,因为请求是一个字符串?我不能简单地使用反射将其转换为类,因为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的限制,这是实现前端控制器模式的好方法吗?如果没有,你能提供一个指导(希望有一些例子,即使是一个简单的),我该怎么做?

从经典到。net/mvc,我可以分享我在经典asp中所做的尽可能接近地模仿这种行为,而不会使它成为太多的维护问题。

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

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

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

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

  6. 在各自的视图中,我使用<!--#include file="class.asp"-->包括我的类/模型文件(如果甚至需要),然后简单地打开Set Model = new cModelClass来初始化并开始在视图中使用它。我没有在controllers.asp中包含类,因为当使用Server.Execute()到视图时,视图不会从controllers.asp继承任何变量。所以我直接在视图中设置了include

错误处理可以在多个级别,但理想情况下,它在controllers.asp。具体的错误处理通常是在实际的模型/类CLASS_INITIALIZE,以避免在控制器中重复使用类,因为它已经在视图中初始化了。

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

相关内容

  • 没有找到相关文章

最新更新