经典ASP应用程序范围的初始化和对象缓存

时间:2010-06-18 00:56:51

标签: asp-classic

在经典ASP(我被迫使用)中,我有一些工厂功能,即功能 返回课程。我使用JScript。

在一个包含文件中,我使用这些工厂函数来创建一些在整个应用程序中使用的。这个包含文件包含在所有页面中的#include指令中。

这些工厂功能做了一些“繁重的工作”,我不希望它们在每个页面加载时执行。

所以,为了清楚起见,我有这样的事情:

// factory.inc
function make_class(arg1, arg2) {
    function klass() {
         //...
    }

    // ... Some heavy stuff

    return klass;
}

// init.inc, included everywhere
<!-- #include FILE="factory.inc" -->
// ...
MyClass1 = make_class(myarg01, myarg02);
MyClass2 = make_class(myarg11, myarg12);
//...

如果不在每次加载页面时调用make_class,我如何实现相同的效果? 我知道

  • 我无法在Application对象中缓存类
  • 我无法在Global.asa
  • 中使用Application_OnStart挂钩
  • 我可能会创建一个脚本组件,但我真的不想这样做

那么,我还能做些什么吗?也许某种方法来实现这些类的缓存,这些类实际上是JScript中的对象。

PS:[进一步澄清]在上面的代码中“重物”并不那么重,但我只是想知道是否有办法避免它一直被执行。它读取数据库元信息,构建数据库中主键的表,以及将字符串解析为类的另一个表等。

1 个答案:

答案 0 :(得分:0)

无法在会话或应用程序中存储asp类的对象(在VBScript中)。

这是因为ASP Classic中的对象不可序列化。好不能自动序列化。你可以自己做......但这当然意味着一些额外的工作。

如上所述,无法在会话或应用程序中存储用vbscript编写的类。

你可以在会话或应用程序中存储用jscript编写的类。所以你要做的就是在jscript中编写你的类,将它们存储在会话中。

然后使用您(现有的)vbscript代码中的thos类。

示例:

&lt; script runat =“server”language =“jscript”&gt;  function MyClass(){     this.Var1 =“54321”;     this.Var2 = Var2;  }  var Var1,Var2;

function MyClassFactory(){     返回新的MyClass();  } &LT; /脚本&GT; &lt; script runat =“server”language =“vbscript”&gt;

dim instance:set instance = MyClassFactory()  instance.Var1 =“12345”

设置会话(“sesInstance”)=实例

response.write session(“sesInstance”)。Var1 &LT; /脚本&GT;

希望这有助于我无法正确粘贴正确格式化的代码...