我正在使用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,但非常有经验的编码员将使用它,并需要快速“得到它”。
我的计划是否有任何漏洞或效率太低?
是否有更易读的方法来创建和管理应用程序变量?
答案 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中的私有方法。