2013-01-03 45 views
3

我們有四種不同的環境:dev,q/a,test和prod。我決定將我們的Application.cfm轉換爲Application.cfc,並將它們放在我們的源代碼控制中。有很多應用程序變量對每個環境都有不同的值。Application.cfc中的自定義方法

我最終創建了幾個sql服務器表來存儲這些環境變量根據它們的類型。現在,我正在動態設置這些應用程序變量。

我的問題是,我開始在application.cfc中添加自定義方法。如果這是最好的地方,我不是100%確定的。 [例如:getAppLinks(),setAppLinks()]。否則,我可以創建一個新的cfc並從Application.cfc中調用這個。

所有這些方法目前正在onApplicationStart()方法中調用一次。

有沒有人對Application.cfc中實現自定義方法有任何意見?

感謝

編輯:增加了一個自定義的方法:

<cffunction name="setUpAppDSNs" access="private" returnType="void" output="false"> 
    <cfargument name="dsn"  type="string" required="yes"> 
    <cfargument name="serverName" type="string" required="yes"> 
    <cfscript> 
     var dsnNames = structNew();   
     var qryAppDSNs = new Query(dataSource = '#arguments.dsn#', 
            sql  = ' SELECT dsnID, #arguments.serverName#Server, description 
                FROM cfAppDSN ').execute().getResult(); 
     for (i = 1; i lte qryAppDSNs.recordCount; i++) { 
      dsnNames['#qryAppDSNs.description[i]#'] = qryAppDSNs['#serverName#Server'][i]; 
     } 

     StructAppend(application,dsnNames); 
    </cfscript> 
</cffunction> 
+0

在我之前的工作中,我們有很多自定義方法位於我們的Application.cfc中,我們從來沒有遇到過問題。如果這將是在整個應用程序中使用的方法,我沒有看到它的問題。 – Anonymous

+0

我這樣做只是在application.cfc中調用的代碼。我的onApplicationStart調用setupApplication(),然後調用一些設置方法。關於這一點的好處是,在onRequest中,我可以檢查URL.reset ==「whatever」並從那裏調用setupApplication(),這有助於開發 – barnyr

+0

太棒了!我有類似的強制應用程序啓動onRequestStart方法內。 – CFNinja

回答

3

我有一個類似的問題,並與我們的globalFunctions.cfc

<cfcomponent displayname="Application" 
    output="false" extends="shared.cfc.globalFunctions"> 

我延長的Application.cfc解決它不知道這是否適用於您,但它允許我們在多個不同的應用程序中使用相同的功能,而無需維護這些功能的多個副本。

+2

這不是很好的繼承。該應用程序與globalFunctions沒有「is-a」關係。它更像是一個「具有」globalFunctions(如此應用程序)的應用程序。cfc有一個屬性,它是一個globalFunctions實例)。所以這是一個組合而不是繼承的例子。你不應該爲了方便而實現繼承(「如果......」,它不會很方便),因爲它會造成混亂的代碼。我建議不要這種方法。 –

+0

可以說我有一個函數titleCase(),其功能類似於coldFusion的uCase()和lCase()。我希望它可以在我的應用程序中的任上面的答案表明,我應該把函數titleCase()放入我的application.cfc文件中,那就沒問題了。如果我有多個應用程序,你是否建議將titleCase()函數剪切並刪除到我的10個application.cfc文件中?這似乎是擴展每個application.cfc,所以有一個地方來維護titleCase()函數是一個更好的方法,幫助我明白我要去哪裏錯了? – Lance

2

Application.cfc只是一個CFC。關於它的唯一「特殊」事情是:

  1. CF每一個請求都實例化一個實例;巧合的是,ColdFusion在那裏尋找一些事件處理程序和攔截器(onApplicationStart()等)。

但它仍然只是一個CFC。鑑於它被稱爲Application.cfc並且在應用程序生命週期中忙於自己,因此將與該應用程序生命週期相關的方法放在那裏是有意義的 - 與組織任何CFC一樣。

所以要回答你的問題...... Application.cfc正是這些方法的正確位置。