将一般udf分配给application.cfc的正确方法是什么?

时间:2010-03-15 18:14:09

标签: coldfusion application.cfc

我只是想在application.cfc中定义一个函数,并将它应用于所有请求。优选地,“分配”仅在应用程序启动时发生。

首选方法是按照以下方式执行某些操作:

<CFCOMPONENT OUTPUT="FALSE">
<CFSET this.name = "Website">
<CFSET this.clientManagement = true>
<CFSET this.SessionManagement = true>

<CFFUNCTION NAME="GetProperty" OUTPUT="False">
    <CFARGUMENT NAME="Property">

    <CFRETURN this.Props[Property]>
</CFFUNCTION>

<CFFUNCTION NAME="OnApplicationStart" OUTPUT="FALSE">
    <CFSET Application.GetProperty = GetProperty>
.
.
.

还是有更好的东西?

4 个答案:

答案 0 :(得分:2)

默认情况下,GetProperty已经在Variables范围内可见,这对于许多用法来说已经足够了(在.cfm模板中)。

如果要直接在组件中使用这些方法,可以在Application范围中引用它们。

虽然我在onRequestStart()中使用Request范围执行此操作,但这只是我个人的偏好。像这样:

request.udf = {};
request.udf.halt = halt;

请注意,一般的最佳做法是封装对象并在宿主对象的变量范围内引用它们。我通常在初始化对象时执行此操作,只需将先前创建的对象作为init()参数传递。

P.S。现在建议使用小写标签及其属性。一种良好的编码实践。

答案 1 :(得分:2)

存储特定于站点的配置数据的最佳方法可能是使用 getProperty(propertyName) SiteConfig.cfc 的新组件>和 setProperty(propertyName,value)。然后,您可以通过在Application.cfc的onApplicationStart方法中执行以下操作,将此CFC存储在应用程序范围中,如:

<cfset application.siteConfig = createObject("component", "SiteConfig").init() />

回到原始问题但是关于在应用程序范围中存储UDF,下面是一种方法。基础是在 onApplicationStart 中,您将使用您的站点的配置属性(如siteName和其他任何内容)创建一个新的应用程序持久化结构。然后将函数存储在CFM文件中,该文件仅在onApplicationStart中包含,然后复制到应用程序范围中。这意味着所有常规页面CFM文件都可以使用 application.getProperty(propertyName)。 由于该函数只创建一次并存储在应用程序范围内,因此它满足了原始问题的要求,即“分配只会在应用程序启动时发生”。

希望这有点帮助!

<强> getProperty.function.cfm

<cffunction name="getProperty" output="false">
    <cfargument name="propertyName" type="string" required="true" />
    <cfreturn application.config[propertyName] />
</cffunction>

<强>的Application.cfc

<cffunction name="onApplicationStart" output="false">
 <cfset application.config = structNew() />
 <cfset application.config.siteName = "My App's Display Name" />
 <cfinclude template="getProperty.function.cfm" />
 <cfset application.getProperty = variables.getProperty />
</cffunction>

<强> test.cfm

<cfset propertyValue = application.getProperty("siteName") />
<cfdump var="#propertyValue#" />

答案 2 :(得分:0)

您可以考虑创建一个单独的“属性”CFC并将其实例化为 在SERVER范围内的单例,它甚至可以从任何CFML页面获得 如果它不是申请的一部分。如果你走这条路,那就没有“服务器 启动“要绑定的事件。相反,您可以将它放在application.cfc的构造函数中 或者在application.cfm

的正文中
    <cfif not structkeyexists(server,"properties")>
        <cflock name ="loadProperties"
            timeout ="10"
            type ="exclusive"
        >
            <cfif not structkeyexists(server,"properties")>

                <cfset server.properties = 
                    createObject("component","path-to-props.cfc")
                    .init({..inital properties..})
                >
            </cfif>
        </cflock>
    </cfif>

锁定代码是为了防止在每个上创建和分配UDF的开销 请求。这也允许属性实例持久化,以便具有 properties.SetProperty()函数将起作用

答案 3 :(得分:0)

您可能还想使用所讨论的技术here

相关问题