Wie lassen sich verschiedene ColdFusion-CFCs einander korrekt zuordnen?

8

Ich habe eine Best-Practice-Frage in Bezug auf die korrekte Art, CFCs zu verwenden, die alle in einem bestimmten Projekt miteinander kommunizieren müssen.

Nehmen wir an, Sie haben beispielsweise eine Webanwendung, die eine Reihe verschiedener Module enthält:

  • Online-Kalender
  • Online-Shop
  • Blog
  • Dateimanager (Dateien hochladen / herunterladen / bearbeiten)
  • Benutzerkonten

Jedes dieser Module ist gut organisiert, so dass die Funktionen, die zu jedem Modul gehören, in separaten CFC-Dateien enthalten sind:

  • Kalender.cfc
  • Store.cfc
  • Blog.cfc
  • Dateien.cfc
  • Benutzer.cfc

Jeder CFC enthält Funktionen, die für das jeweilige Modul geeignet sind. Zum Beispiel enthält die Users.cfc Funktionen, die das An- und Abmelden von Benutzern, das Aktualisieren von Kontoinformationen usw. betreffen. Manchmal muss ein CFC möglicherweise auf eine Funktion in einem anderen CFC verweisen, z. B. wenn der Speicher (Store.cfc) Informationen von einem Kunden (Users.cfc) abrufen muss. Ich bin mir jedoch nicht sicher, wie ich das erreichen soll. Es gibt ein paar Möglichkeiten, mit denen ich gespielt habe, damit meine CFCs sich gegenseitig referenzieren können:

Methode 1: In einem CFC die anderen CFCs, die Sie benötigen, instanzieren:

%Vor%

Dieser Ansatz scheint die meiste Zeit zu funktionieren, es sei denn, einige der instanzierten CFCs führen auch die CFC-Instanzen auf, die sie als Beispiele verwenden. Beispiel: Wenn die Dateien Users.cfc die Dateien .cfc und Files.cfc auch die Instanzen Users.cfc instanziieren. Ich habe Probleme mit gelegentlichen gefürchteten NULL-NULL-Fehlern mit diesem wahrscheinlich wegen einer Art von unendlichen Rekursionsproblem.

Methode 2: Instanz alle benötigten CFCs innerhalb eines CFC-Funktionsumfangs (dies scheint die Rekursionsprobleme zu verhindern):

%Vor%

Mein Anliegen bei diesem Ansatz ist, dass er in Bezug auf Speicher- und Verarbeitungseffizienz möglicherweise nicht so effizient ist, weil Sie die gleichen CFCs für jede Funktion, die sie benötigt, mehrfach verwenden müssen. Es löst jedoch das Problem von Methode 1 der unendlichen Rekursion, indem es die CFCs auf ihre jeweiligen Funktionsbereiche isoliert.

Eine Sache, die ich aufgrund von Dingen, die ich online gesehen habe, und Artikeln über objektorientierte Programmierung dachte, ist die Nutzung einer "Base.cfc", die die "extends" -Eigenschaft des cfcompontent-Tags verwendet, um alle CFCs zu instanziieren in der Bewerbung. Ich habe diese Art von Setup jedoch noch nie getestet und bin mir nicht sicher, ob dies der ideale Weg ist, um alle meine CFCs miteinander kommunizieren zu lassen, besonders da ich glaube, dass Override-Funktionen verwendet werden, wenn sie eine gemeinsame Funktion haben Name (zB "init ()").

%Vor%

Was ist die richtige "Best-Practice" -Methode zur Lösung dieser Art von Problem?

    
Dave L 07.11.2014, 16:38
quelle

2 Antworten

15

Wenn jeder Ihrer CFC-Instanzen Singletons sein soll (d. h. Sie benötigen nur eine Instanz davon in Ihrer Anwendung), dann sollten Sie auf jeden Fall in Dependancy Injection schauen. Es gibt drei Haupt-Independent-Injection-Frameworks für CF; ColdSpring, WireBox und DI / 1.

Ich schlage vor, dass Sie sich DI / 1 oder WireBox ansehen, da ColdSpring für eine Weile nicht aktualisiert wurde.

Die Wiki-Seite für DI / 1 ist hier: Ссылка

Wirebox Wiki Seite ist hier: Ссылка

Im Wesentlichen erstellen diese Frameworks Ihre CFCs (Beans) und behandeln dann die Abhängigkeiten, die sie zueinander haben. Also, wenn Sie Ihre instanziierten CFC bekommen müssen, ist es bereits verdrahtet und bereit zu gehen.

Abhängigkeit Injection wird manchmal auch als IoC (Inversion of Control) bezeichnet und ist ein häufiges Designmuster, das in vielen Sprachen verwendet wird.

Hoffe das hilft und viel Glück!

    
John Whish 07.11.2014, 17:06
quelle
1

Wenn Ihre cfcs nicht miteinander verwandt sind, passt das Konzept von base.cfc nicht. Die Vererbung hat für Klassen gemeinsame Dinge, die voneinander erben können. Wenn Sie beispielsweise User.cfc haben und eine neue cfc namens customer.cfc hinzufügen möchten, würde ich von User erben und einige Funktionen überschreiben oder einige hinzufügen, ohne die eigentliche user.cfc zu berühren. Also, zurück zu Ihrer Frage, da die CFC nicht verwandt sind oder untereinander und um Querverweise zu vermeiden, werde ich erstellen, dass ServiceFactory Instanzen von cfcs wie folgt hält

%Vor%

und referenzieren es durch

%Vor%

Denken Sie daran, dass dieser Ansatz nur funktioniert, wenn Sie einen anderen CFC zur Verwaltung Ihrer Logik haben

Sie können das Gleiche für alle anderen Dienste tun. Wenn Ihre Funktionen statisch sind, können Sie Ihre Dienste im Anwendungsbereich der Anwendung speichern und nur einmal (wie Singleton) instanziieren.

Die dritte Option, die Sie haben, ist DI (Abhängigkeit Injection) Framework

    
Click 07.11.2014 17:32
quelle

Tags und Links