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,但非常有经验的编码人员将使用它,并需要快速"获取".
我的计划是否有任何漏洞或效率太低?
是否有更易读的方法来创建和管理应用程序变量?
为什么不立即将定义移动到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)
实际上,在重新阅读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 中的私有方法中,以进一步方便。
| 归档时间: |
|
| 查看次数: |
5130 次 |
| 最近记录: |