实现前端控制器模式
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_command
、action
、action_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 中所做的,以尝试尽可能接近地模拟这种行为,而不需要这太维护问题了。
使用URL在IIS中重写是我的routes
。我通常只创建一个路由,direct/rewrite 所有入站请求到一个 controller.asp
页面以简化事情,并且没有一堆规则和控制器直接在我的 URL 中重定向重写设置以使其更容易维护(对我来说)。
在 controllers.asp
中使用 Request.ServerVariables("HTTP_X-ORIGINAL-URL")
你可以获取实际输入的 URL,return 类似.. /real/url
在 controllers.asp
中使用 Server.Execute("view1.asp")
根据输入的 url 以编程方式调用视图
我有一个名为 routes.asp
的 class 文件,它包含在每个 model/class 文件中,帮助我收集 URL 属性 oRoute.GetPath_FirstDirectory()
等等。然后 model/class 文件使用此数据创建其 属性 值,视图可以使用这些值。在每个 model/class 中使用 CLASS_INITIALIZE
从 route/url 填充自身,或者也可以直接在视图中完成。
在各自的视图中,我使用 <!--#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 中的内容,但这是我想出的最好的方法,对我来说也是最容易维护的。也许其他人有其他实现,但这是我的,完全基于我的经验。到目前为止,一切进展顺利。
几天来,我一直在尝试在基于 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_command
、action
、action_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 中所做的,以尝试尽可能接近地模拟这种行为,而不需要这太维护问题了。
使用URL在IIS中重写是我的
routes
。我通常只创建一个路由,direct/rewrite 所有入站请求到一个controller.asp
页面以简化事情,并且没有一堆规则和控制器直接在我的 URL 中重定向重写设置以使其更容易维护(对我来说)。在
controllers.asp
中使用Request.ServerVariables("HTTP_X-ORIGINAL-URL")
你可以获取实际输入的 URL,return 类似../real/url
在
controllers.asp
中使用Server.Execute("view1.asp")
根据输入的 url 以编程方式调用视图
我有一个名为
routes.asp
的 class 文件,它包含在每个 model/class 文件中,帮助我收集 URL 属性oRoute.GetPath_FirstDirectory()
等等。然后 model/class 文件使用此数据创建其 属性 值,视图可以使用这些值。在每个 model/class 中使用CLASS_INITIALIZE
从 route/url 填充自身,或者也可以直接在视图中完成。在各自的视图中,我使用
<!--#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 中的内容,但这是我想出的最好的方法,对我来说也是最容易维护的。也许其他人有其他实现,但这是我的,完全基于我的经验。到目前为止,一切进展顺利。