我应该在什么范围内放置实用程序单例组件?

时间:2015-09-22 21:52:56

标签: coldfusion scope coldfusion-10

我们刚刚升级到CF10,我正在完成一个缺少""实用函数(主要与迭代相关,如mapreduce)。应始终在应用程序的每个页面和每个组件中提供这些功能。它们是无状态组件的方法,它基本上充当模块或命名空间。

我通过将组件称为_来取代Underscore及其同类。因此,用法看起来像_.map(myArray, myCallback);。我的问题是我应该放置_变量。我可以使用variables._ = new Shared.Components.Util.FunctionalUtil();开始每个页面,但这很烦人,我们最终会得到很多无用的副本。我希望全局声明它,并且每个请求初始化不超过一次。

ColdFusion"全球"范围是:CGI,URL,表单,Cookie,客户端。这些是用于名称解析的范围,它们在请求中共享其值。其中,CGI,URL和Form范围存在冲突风险,Cookie范围实际上将数据存储在客户端上;这离开了客户端。但是,组件无法存储在客户端范围中。事实上,唯一可行的是URL和Form,而Form并不总是存在。

现在,将实用程序组件填充到URL类似乎是一件值得怀疑的事情。有更好的选择吗?

3 个答案:

答案 0 :(得分:3)

最简单的方法是在应用程序启动时初始化静态组件,并声明一个别名(简写)以便在页面上下文中使用。

// Application.cfc

public boolean function onApplicationStart() {

    APPLICATION.FU = new Shared.Components.Util.FunctionalUtil();

    return true;
}

public boolean function onRequest(required string targetPage) {

    VARIABLES._ = APPLICATION.FU;

    include ARGUMENTS.targetPage;
    return true;
}

您现在可以使用_.someFunction();访问静态组件。在页面上下文之外(例如在另一个组件中),使用APPLICATION.FU.someFunction();

答案 1 :(得分:1)

您可以使用REQUEST范围或APPLICATION范围。应用程序范围是典型的选择,因为它是“一次写入多次读取” - 换句话说,在您启动库之后,它可供所有人使用,而不需要重新启动。

答案 2 :(得分:1)

正确的答案应该是application范围,但我看到使用formurl范围的代码可以明确指定范围名称。