2008-08-25 19 views

Antwort

18

Es gibt mehrere Bereiche, die für jeden Teil Ihres Codes verfügbar sind: Sitzung, Client, Cookie, Anwendung und Anfrage. Von einigen wird nicht empfohlen, sie auf bestimmte Weise zu verwenden (z. B. Verwendung des Anforderungs- oder Anwendungsbereichs in Ihren benutzerdefinierten Tags oder CFCs; dies ist coupling, verstößt gegen Einkapselungsprinzipien und wird als schlechte Praxis angesehen) und einige haben spezielle Zwecke: Cookie wird auf dem Client beibehalten Machine als physische Cookies und Session-Bereichsvariablen sind benutzerspezifisch und laufen mit der Benutzersitzung auf der Website ab.

Wenn eine Variable äußerst unwahrscheinlich zu ändern ist (konstant für alle Absichten und Zwecke) und einfach beim Start der Anwendung initialisiert und nie wieder geschrieben werden kann, sollten Sie es im Allgemeinen in Anwendungsbereich legen, da dies zwischen jedem Benutzer und jedem besteht Session. Bei korrekter Implementierung wird es einmal geschrieben und N-mal gelesen.

Eine ordnungsgemäße Umsetzung von Application-Variablen in Application.cfm könnte wie folgt aussehen:

<cfif not structKeyExists(application, "dsn")> 
    <cflock scope="application" type="exclusive" timeout="30"> 
     <cfif not structKeyExists(application, "dsn")> 
      <cfset application.dsn = "MyDSN" /> 
      <cfset foo = "bar" /> 
      <cfset x = 5 /> 
     </cfif> 
    </cflock> 
</cfif> 

Beachten Sie, dass die Existenz der Variablen in dem Anwendungsbereich vor und nach der Sperre aktiviert ist, so dass, wenn zwei Benutzer Erstellen Sie eine Race-Bedingung beim Start der Anwendung, nur einer von ihnen wird am Ende setzen Sie die Anwendungsvariablen.

Der Vorteil dieses Ansatzes besteht darin, dass diese gespeicherten Variablen bei jeder Anforderung nicht ständig aktualisiert werden, wodurch die Zeit des Benutzers und die Verarbeitungszyklen des Servers verschwendet werden. Der Kompromiss ist, dass es ein wenig ausführlich und komplex ist.

Dies wurde mit dem Zusatz Application.cfc erheblich vereinfacht. Jetzt können Sie festlegen, welche Variablen auf Anwendungsstart erstellt und müssen sich keine Sorgen über Sperren und Überprüfung auf Existenz und all das Spaßmaterial:

<cfcomponent> 
    <cfset this.name = "myApplicationName" /> 

    <cffunction name="onApplicationStart" returnType="boolean" output="false"> 
     <cfset application.dsn = "MyDSN" /> 
     <cfset foo = "bar" /> 
     <cfset x = 5 /> 
     <cfreturn true /> 
    </cffunction> 
</cfcomponent> 

Für weitere Informationen über Application.cfc einschließlich aller der Verschiedene Sonderfunktionen und jedes Detail, was und wie man es benutzt, I recommend this post on Raymond Camden's blog.

Zusammengefasst, Request-Bereich ist überall in Ihrem Code verfügbar, aber das macht es nicht unbedingt "richtig", es überall zu verwenden. Es besteht die Möglichkeit, dass Ihr Vorgänger die Einkapselung durchbrochen hat, und das kann mühsam sein. Sie können es am besten verlassen, wie es ist, aber zu verstehen, welcher Umfang das beste Werkzeug für den Job ist, wird definitiv Ihren zukünftigen Code verbessern.

15

Dies ist eine sehr subjektive Frage, und einige würden sogar argumentieren, dass es nie "angemessen" ist, den Anforderungsbereich in modernen ColdFusion-Anwendungen zu verwenden.

Mit diesem Disclaimer aus dem Weg, lassen Sie uns definieren, was der Anwendungsbereich der Anfrage ist und wo es sinnvoll wäre.

Der Anforderungsbereich ist der absolute globale Bereich in einer einzelnen ColdFusion-Seitenanforderung. Es ist kein freigegebener Bereich, wie Anwendungs-, Server-, Client- und Sitzungsbereiche, daher ist das Sperren nicht erforderlich, um es threadsicher zu machen (es sei denn, Sie erzeugen Arbeitsthreads aus einer einzelnen Anfrage mit dem CFTHREAD-Tag von CF8). Als globaler Bereich ist dies eine sehr praktische Möglichkeit, Variablen über eine beliebige Ebene im Stapel der Anforderung persistent zu halten, ohne sie von einem übergeordneten an einen aufrufenden Knoten übergeben zu müssen. Dies war eine sehr häufige Möglichkeit, Variablen in älteren CF-Apps durch verschachtelte oder rekursive benutzerdefinierte Tags zu persistieren.Beachten Sie, dass viele Anwendungen diesen Bereich verwenden, um Variablen auf Anwendungsebene (z. B. Konfigurationseinstellungen) zu speichern. Der große (und manchmal auch subtile) Unterschied zwischen dem Anforderungsbereich und dem Anwendungsumfang ist jedoch der Wert der gleichen Anforderung -coped Variable kann zwischen einzelnen Seitenanforderungen abweichen.

Ich würde schätzen, dass Ihr Vorgänger diesen Bereich als ein Mittel verwendet hat, Variablen bequem zu setzen, die den Sprung zwischen eingekapselten oder verschachtelten Codeeinheiten überleben mussten, ohne sie explizit weitergeben zu müssen.

0

Okay, ich wollte nur Ihren Code kommentieren. Bitte vergib mir, wenn ich verrückt aussehe. Aber Sie haben bereits überprüft, dass der structKeyExists am Anfang. Da du weißt, dass es wahr ist, würde es keinen Sinn machen, einen weiteren Check durchzuführen. Also wäre meine Version davon ... Aber das ist nur ich.


<cfif not structKeyExists(application, "dsn")> 
    <cflock scope="application" type="exclusive" timeout="30"> 
      <cfset application.dsn = "MyDSN" /> 
      <cfset foo = "bar" /> 
      <cfset x = 5 /> 
    </cflock> 
</cfif> 

In Ordnung.

+0

Best Practices Mandat, das Sie erneut im CFLock überprüfen, um Race Conditions zu vermeiden. –

+2

"Best Practice" zum Festlegen der Anwendungsbereichsvariablen, da CFMX6.0 nur CFLOCK verwenden soll, besteht die Möglichkeit einer Race Condition, in der es keine gibt der hier angebotene Code. Wenn man nur einen einfachen Wert in eine anwendungsspezifische Variable setzen möchte und der gesamte Prozess atomar ist (dh: es ist eine Anweisung, und es gibt keinen Spielraum für eine Race-Bedingung, wie in diesem Beispiel), wird nur ein CFPARAM-Tag verwendet fein. –

0

Ich habe meine Firma Framework geschrieben, die verwendet werden, unsere Website zu betreiben.

Ich benutze die Anfragevariable, um bestimmte Daten zu setzen, die den anderen CFCs zur Verfügung stehen würden, damit die Daten in der ganzen Anwendung verfügbar wären, ohne die Daten ständig weiterzugeben. Ich glaube ehrlich, dass mit der Anfrage und Anwendung, solange es eine statische Funktion Komponente ist, dann sollten Sie kein Problem haben. Ich bin mir nicht sicher, ob ich damit falsch liege, aber sobald ich den Rahmen freigegeben habe, werden wir sehen.