如何最好地创建和存储APPLICATION变量?

Evi*_*mes 5 coldfusion application.cfc coldfusion-9

我正在使用ColdFusion 9.0.1

我正在接管一个网站,我之前的人创建了大约100个变量并将它们放入APPLICATION范围.我相信他的100个变量不断被每个页面加载覆盖.

基本上,他在Application.cfc中有这个:

APPLICTION.VariableOne = "SomeStringOne";
APPLICTION.VariableTwo = "SomeStringTwo";
APPLICTION.VariableThree = "SomeStringThree";
Run Code Online (Sandbox Code Playgroud)

我的计划是保持简单,而且非常易读,可以测试应用程序范围内的特定结构.如果不存在,请创建结构和变量:

if (not isDefined("APPLICTION.AppInfo") or not isStruct(APPLICTION.AppInfo)) {
    APPLICTION.AppInfo = structNew();
    APPLICTION.AppInfo.VariableOne = "SomeStringOne";
    APPLICTION.AppInfo.VariableTwo = "SomeStringTwo";
    APPLICTION.AppInfo.VariableThree = "SomeStringThree";
}
Run Code Online (Sandbox Code Playgroud)

当然,一旦站点生效并且我们完成了创建所有应用程序变量,我将把它移到onApplicationStart()方法中.

我想要的解决方案必须更多地关注"可读性"而不是"效率".一些非CFers,但非常有经验的编码人员将使用它,并需要快速"获取".

我的计划是否有任何漏洞或效率太低?

是否有更易读的方法来创建和管理应用程序变量?

Jak*_*sel 5

为什么不立即将定义移动到onApplicationStart()?如果您需要在开发期间重置它们,您可以随时传入一个URL变量来标记它以进行重置,如下所示:

<!--- in Application.cfc --->

<cffunction name="onRequestStart">
<cfif IsDefined("url.resetApp")>
  <cfset ApplicationStop()>
  <cfabort><!--- or, if you like, <cflocation url="index.cfm"> --->
</cfif>
</cffunction>
Run Code Online (Sandbox Code Playgroud)


Sha*_*mes 1

实际上,在重新阅读OP并阅读建议的解决方案之后,我将不得不同意OP的设置,因为这个非常重要的原因:

这个,在 onApplicationStart() 中

APPLICTION.AppInfo = structNew();
APPLICTION.AppInfo.VariableOne = "SomeStringOne";
APPLICTION.AppInfo.VariableTwo = "SomeStringTwo";
Run Code Online (Sandbox Code Playgroud)

然后可以在 onRequestStart() 中变成这样

<cflock name="tmp" type="readonly" timeout="15">
   <cfset REQUEST.AppInfo = APPLICATION.AppInfo />
</cflock>
Run Code Online (Sandbox Code Playgroud)

然后,您的应用程序可以继续方便地访问 REQUEST 变量,尤其是,如果您决定要在同一范围内缓存 CFC,它们只需进入一个单独的键即可:

   APPLICATION.Model.MyObject = CreateObject('component','myobject');
Run Code Online (Sandbox Code Playgroud)

当然,这也会被注入到 REQUEST 中(如果你选择的话)

想走上面Jake Feasel的路线吗?没问题:

   <cfif isDefined('URL.reload')>
      <cfset APPLICATION.Model = StructNew() />
   </cfif>
Run Code Online (Sandbox Code Playgroud)

现在,您可以灵活地终止对象缓存,但保留变量(或根据您的选择反之亦然)。

这是一个很好的设置,还有另一个原因:如果您想构建自己的开发/生产“模式”,其中开发模式始终重新编译 CFC,但生产模式会缓存它们。除此之外,您必须进行的唯一更改是上面提到的 REQUEST 设置:

<cfif (isProduction)>
    <cflock name="tmp" type="readonly" timeout="15">
       <cfset REQUEST.AppInfo = APPLICATION.AppInfo />
    </cflock>
<cfelse>
   <cfset REQUEST.AppInfo = StructNew() />
   <cfset REQUEST.AppInfo.VariableOne = "SomeStringOne" />
   ...etc...
</cfif>
Run Code Online (Sandbox Code Playgroud)

您还可以将变量的设置和对象的创建放入 Application.cfc 中的私有方法中,以进一步方便。