Frage

Ich habe ein Gateway geschrieben, um ein Ergebnis zu erhalten, setzt aus meiner Datenbank. Wie speichere ich jede Zeile in einem separaten dao, so dass ich weiter jeden Datensatz manipulieren? Oder kann ich Zugriff auf die Ergebnismenge direkt die Datensätze zu bekommen?

Das ist mein Gateway (btw, ich soll die bedingte Logik innerhalb des cfquery in ein separates cfc schreiben, der dieses erstreckt?)

<cfcomponent name="MaterialDao" hint="data access object" output="false">
 <cffunction name="init" hint="constructor" access="public" output="false" returntype="MaterialDao">
  <cfargument name="dsn" type="String" required="true" hint="datasource" />
  <cfset variables.instance.dsn = arguments.dsn />
  <cfreturn this />
 </cffunction>

 <cffunction name="readMaterial" hint="read" access="public" output="false" returntype="Query">
  <cfargument name="district" type="String" />
  <cfset var qReadMaterial = "" />
  <cfquery name="qReadMaterial" datasource="#variables.instance.dsn#">
   <cfif StructKeyExists(arguments,"district")>
   SELECT A.NR, A.BEZ, D.BES, D.STA
   <cfelse>
   SELECT A.NR, A.BEZ
   </cfif>
   FROM  DEK AS D INNER JOIN ART AS A
   ON D.NR = A.NR
   WHERE 0=0
   <cfif StructKeyExists(arguments,"district")>
    AND D.BEZ = #arguments.district#
   </cfif>
   ORDER BY A.BEZ
 </cfquery>
 <cfreturn qReadMaterial />
 </cffunction>
</cfcomponent>

Ich habe schon viele Artikel und es scheint, dass es unterschiedliche Meinungen über diese Angelegenheit (DAO vs. Gateway DAO &-Gateway etc.). Was ist die beste Praxis, was tun die Profis?

War es hilfreich?

Lösung

Die Profis verwenden nur ein Muster für die Datenbank-Zugriffsschicht. Die Verwendung von sowohl einem DAO und Gateway ist eine falsche Bezeichnung, die ich bin nicht wirklich sicher, wo es angefangen hat, scheint aber in der Coldfusion-Menge nur zu existieren. Die DAO und Gateway-Muster können so ziemlich die gleiche Funktion erfüllen, aber ich denke, die DAO die Rechnung mehr paßt, wenn man über Datenbank-Interaktion zu sprechen.

DAOs sollte Funktionalität für CRUD Methoden und Rückkehr Sätze von Aufzeichnungen enthalten. Da CRUD und Grundsatzmengen hochrepetitiven sind, verwende ich einen Code-Generator den Code für diese Interaktion zu erstellen und dann anpassen, was ich brauche. Dies ist ein guter Ort für die bedingte Logik für die Datensätze auswählen, die Sie benötigen.

Wie Aaron erwähnte, in Ihrer Datenbank ein Array von Objekten für eine Reihe von Aufzeichnungen Rückkehr ist nicht machbar in Coldfusion aufgrund der der Performance-Overhead-Objekte zu schaffen. Ich verwende in der Regel nur die grundlegende Abfrage von der DAO in meinen Ansichten zurückgegeben. Wenn jedoch das, was ich bin Modellierung eines bestimmtes Verhalten in einer Ansicht braucht, dann werde ich die Abfrage in einem Objekt setzt etwas mit ähnlich dem, was Peter Bell tut.

Andere Tipps

Peter Bell hatte eine große Präsentation vor einigen Monaten bei seiner Entlassung des Iterieren Business Object CFC, die mehrere Datensätze und iterieren einen Datensatz zu einem Zeitpunkt, mit diesem einfachen Rahmen nehmen können: http://ibo.riaforge.org/ . Bis CF ein wenig schneller zu generieren Objekte ist, eine einzelne Instanz eines Objekts das Recycling und die Eigenschaften repopulating ist wahrscheinlich die beste besten. Vielleicht kann dies Sie zu einer Zeit, in Ihre DAO einen Datensatz helfen laden.

Bedingte Logik kann im Gateway oder in einem Manager-CFC gehen. Normalerweise würde ich eine Logik, die wie die Logik skizzierte in einem Beitrag direkt im CFC einfach ist.

Ein bisschen Beratung, können Sie möchten die arguments.distinct nicht erforderlich, und tun eine einfache Prüfung mit machen, wenn (StructKeyExists (Argumente, „distinct“)) {etwas tun}.

Grüße,

-Aaron Greenlee

Bei uns dachten wir lange und hart über diese Dinge für ein paar Monate, die Adobe CF DAO Schöpfer über RDS versucht und einige andere ältere (jemand CFPowerTools erinnern?).

Wir entschieden uns am Ende unserer eigenen DAO-Code-Generator zu schreiben, und ich dachte, dass ich hier unsere Gedanken teilen würde. Der Grund haben wir uns entschieden, weil wir Sperrhinweise, um aus SQL hinzuzufügen erforderlich, wir es effizienter, sicherer und sauberer machen wollte.

Das Setup wir beschlossen war eine vordefinierte Basis DAO-Objekt (genannt DAO.cfc), die alle generierten ‚table‘ DAOs erweitert zu erstellen. es hatte alles war ein paar nützliche Methoden, aber das Wichtigste ist, dass wir dort keine anderen Funktionen hinzufügen können, dass wir alle unsere erzeugten DAOs müssen Zugriff haben.

So wir Auto-Code generieren, indem Sie eine Tabelle aus der Datenbank auszuwählen (unter Verwendung des CF Admin-API) und erstellen Sie die [TableName].cfc DAO mit den üblichen init, Getter und Setter, so der Grund CRUD Sachen.

Zusätzlich dazu, wir erzeugen auch eine [TableName]GatewayBase.cfc und [TableName]Gateway.cfc. [TableName]Gateway.cfc [TableName]GatewayBase.cfc erstreckt.

Also für eine Probe DAO Lauf auf einer Tabelle mit dem Namen ‚Kunden‘, die erstellten Dateien sind:

Customers.cfc /* extends DAO.cfc [not created, already exists] */
CustomersGateway.cfc 
CustomersGatewayBase.cfc /* extends CustomersGateway */

So ist die Idee, dass das Gateway eine Möglichkeit bietet, mit vielen "Kunden-Datensätze zu behandeln - die DAO verwendet wird, wenn sie mit einer und nur einer Behandlung. Alle Methoden im Gateway werden in der Regel ein CF-Abfrage-Objekt zurück. CF ist zu ineffizient massiver Arrays von DAO-Objekten zu erstellen und die Abfrage Objekt in CF in unserem Geist ist wirklich flexibel, so freuen wir uns, es zu benutzen.

Bei der Codierung, die Unterklasse CustomerGateway.cfc ist die einzige instanziiert und verwendet. Es ist jedoch die Basisklasse erweitert hat einige sehr nützliche generische Funktionen, die kostenlos kommen, wie getFieldListByProperty(), die auf übergebenen Parameter auf Basis werden bestimmte Felder zurückkehren (dh Tabellenspalten) durch eine bestimmte Eigenschaft (dh ein Spaltenwert), so zum Beispiel:

myGateway.getFieldListByProperty(property="status", value="1", fieldList="customerName,customerID", orderBy="createdOn") />

Der Anruf wird wieder die ‚customer‘ und ‚customerID‘ Werte für alle Kunden mit dem Status 1, von dem Datum sortiert sie erstellt wurden. Der Code wird auch gegen SQL-Injection-gehärtet und validiert, so vernünftige Ausnahmen geworfen werden.

Diese Funktion wird von 99% liefern (wir hoffen!) Des Multi-Rekord Abfrage Sie auf einem Tisch tun. Wenn Sie eine sophisiticated Abfrage benötigen, dann ist die CustomerGateway.cfc für Sie da Funktionen hinzuzufügen.

Schließlich ermöglichen wir Ihnen, Funktionen hinzufügen CFC CustomerGateway nur , denn wenn man den Kunden Tabelle zu ändern (zum Beispiel eine Spalte hinzufügen), müssen Sie die Tabelle neu erstellen, und tha die Customers.cfc überschreiben und die CustomersGatewayBase.cfc. Allerdings Ihr eigener Code (falls vorhanden) in der Unterklasse sicher.

Wie auch immer, könnte dies etwas off topic, aber sicher, dass ich dachte, jemand unsere Erfahrung nützlich sein könnte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top