我们刚刚升级到CF10,我正在完成一个缺少""实用函数(主要与迭代相关,如map
和reduce
)。应始终在应用程序的每个页面和每个组件中提供这些功能。它们是无状态组件的方法,它基本上充当模块或命名空间。
我通过将组件称为_
来取代Underscore及其同类。因此,用法看起来像_.map(myArray, myCallback);
。我的问题是我应该放置_
变量。我可以使用variables._ = new Shared.Components.Util.FunctionalUtil();
开始每个页面,但这很烦人,我们最终会得到很多无用的副本。我希望全局声明它,并且每个请求初始化不超过一次。
ColdFusion"全球"范围是:CGI,URL,表单,Cookie,客户端。这些是用于名称解析的范围,它们在请求中共享其值。其中,CGI,URL和Form范围存在冲突风险,Cookie范围实际上将数据存储在客户端上;这离开了客户端。但是,组件无法存储在客户端范围中。事实上,唯一可行的是URL和Form,而Form并不总是存在。
现在,将实用程序组件填充到URL类似乎是一件值得怀疑的事情。有更好的选择吗?
答案 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
范围,但我看到使用form
或url
范围的代码可以明确指定范围名称。