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

时间:2011-11-28 20:37:11

标签: coldfusion coldfusion-9 application.cfc

我正在使用ColdFusion 9.0.1

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

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

APPLICTION.VariableOne = "SomeStringOne";
APPLICTION.VariableTwo = "SomeStringTwo";
APPLICTION.VariableThree = "SomeStringThree";

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

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";
}

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

我想要的解决方案必须更多地关注“可读性”而不是“效率”。几个非CFers,但非常有经验的编码员将使用它,并需要快速“得到它”。

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

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

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分:1)

我会继续使用OnApplicationStart,但回到Application.cfc之前我们曾经做过类似Application.Build的事情,如果Build值不同,那么我们在Application变量上做了所有的设置。如此快速和肮脏将是这样的:

<cfparam name="Application.Build" default="" />

<cfset Build = "28-Nov-2011" />

<cfif Application.Build IS NOT Variables.Build OR StructKeyExists(URL, "Rebuild")>
 <cfset Application.Build = Variables.Build />
 <!--- A bunch of other CFSETs --->
</cfif>

虽然我们所拥有的是Application.cfm

,但我们还是使用了这种方法

答案 2 :(得分:1)

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

这在onApplicationStart()

APPLICTION.AppInfo = structNew();
APPLICTION.AppInfo.VariableOne = "SomeStringOne";
APPLICTION.AppInfo.VariableTwo = "SomeStringTwo";

然后可以在onRequestStart()

中变成这个
<cflock name="tmp" type="readonly" timeout="15">
   <cfset REQUEST.AppInfo = APPLICATION.AppInfo />
</cflock>

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

   APPLICATION.Model.MyObject = CreateObject('component','myobject');

当然,这也会涌入REQUEST(如果你选择)

想要去Jake Feasel的路线吗?没问题:

   <cfif isDefined('URL.reload')>
      <cfset APPLICATION.Model = StructNew() />
   </cfif>

现在你可以灵活地杀死你的对象缓存但​​是保持你的变量(反之亦然)。

出于另一个原因,这是一个很好的设置:如果您想构建自己的开发/生产“模式”,其中开发模式始终重新编译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>

为了更加方便,您还可以将变量和对象的创建设置为Application.cfc中的私有方法。