【问题标题】:Implementing Front Controller pattern实现前端控制器模式
【发布时间】:2015-09-18 00:20:14
【问题描述】:

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

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

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

【问题讨论】:

  • 所以你的意图是调用一个与传递的字符串参数同名的本地(或导入)函数?
  • @Bond 没错。控制器将是这个中心包含。它将有一个处理请求的处理程序,稍后将创建一个处理请求的命令类和一个将用户重定向到正确视图的调度程序。

标签: vbscript asp-classic front-controller


【解决方案1】:

从经典迁移到 .net/mvc 我可以分享我在经典 asp 中所做的工作,以尽可能接近地模拟这种行为,而不会造成过多的维护问题。

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

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

  3. controllers.asp 中,使用Server.Execute("view1.asp") 以编程方式根据输入的url 调用视图

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

  5. 在相应的视图中,我使用<!--#include file="class.asp"--> 包含我的类/模型文件(如果需要),然后只需打开Set Model = new cModelClass 进行初始化并开始在视图中使用它。我没有在controllers.asp 中包含该类,因为在将Server.Execute() 用于视图时,视图不会从controllers.asp 继承任何变量。所以我直接在视图中include它。

这里的错误处理可以是多个级别,但最好是在controllers.asp 中。具体的错误处理通常在实际模型/类CLASS_INITIALIZE 中,以避免在控制器中冗余使用该类,因为它已经在视图中初始化。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-30
    • 2016-04-03
    • 1970-01-01
    • 2011-01-15
    • 2012-08-31
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    相关资源
    最近更新 更多