Persistenter Objekte


Objektdaten müssen letztlich in einer Datenbank gespeichert werden. Dieser Artikel zeigt Ihnen wie.
Persistenter Objekte
In den letzten Artikeln haben wir eingeführt, Business Objects und gezeigte, wie einfache Beziehungen dargestellt werden können. Ausgedrückt als Objekteigenschaften Beziehungen sind eine formale (und neutral) Darstellung der Beziehungen zwischen Datenentitäten, die innerhalb des Datenbankentwurfs implizite oder explizite innerhalb des Datenbankschemas werden können. Abkehr von einer Daten-zentrierte Ansicht von Entitäten und Beziehungen auf eine besser strukturierte, objektorientierte Ausstellung hat viele Vorteile, aber die meisten Sprachen (einschließlich Delphi) sorgen nur für ein Objekt im Speicher-Modell; Objekte haben keine Zustand-Ausdauer-Funktion, wenn man für sie bereitgestellt wird.
Es gibt viele Design-Lösungen zu diesem Problem und wir haben bereits festgestellt, daß die Geschäftsobjekte (Problemdomäne) sich nicht direkt mit der Datenbank kommunizieren soll. Eine angemessene Gestaltung ist einen anderen Satz von Klassen, die rein als Objektschnittstelle zur Datenbank vorhanden und werden zum Laden und Speichern von Domäne-Objekt Problemzustand verantwortlich. Unser Problem Domain-Objekte werden wissen nichts über wie ihren Zustand auf der Festplatte nur gespeichert werden, gibt es eine besondere Klasse, die für diesen Vorgang verantwortlich ist. Die Geschäftsobjekte werden eine Methode aufrufen, die auf ein solches Objekt und delegieren die Arbeit zu machen.
Die erste Entscheidung, die getroffen werden muss ist zu entscheiden, wie Objekte auf ein Datenbankschema zugeordnet werden. Obwohl es eine Reihe von Objektdatenbanken gibt, haben die meisten Unternehmen auf einem vorhandenen RDBMS standardisiert, mit denen sie bequem und erfahrener sind. Eine Änderung der Entwicklung zu einem stärker objektorientierten Ansatz zu fördern ist schwierig genug, ohne zu fordern, dass die in der Regel große Investition in eine hoch entwickelte Datenbanktechnologie für eine neue, ungewohnte repliziert wird. Daher konzentriert sich dieser Artikel auf Zuordnung zu einem SQL-basierten RDBMS, Objekte, als dies die meisten installierten Entwicklungssysteme darstellt. Es sollte jedoch betont werden, daß einer der Vorteile unseres Objekt-Modells ist, dass es völlig Architektur-Neutral und kann auf eine große Anzahl von verschiedenen Datenbank-Topologien, einschließlich ISAM und objektbasierte Einsen angewendet werden.
Zuordnung von Objekten zu Datenbanken
Es ist offensichtlich und natürlich, dass es eine relativ einfache konzeptionelle Beziehung zwischen einem Objekt und einem Datenbank-Tupel (Datensatz gibt). Beim Speichern von Objektzustand in einem RDBMS ist daher eine sehr verbreitet und praktische Lösung eine Domäne Problemklassen Tabellen, Objekte zu Datensätzen und Eigenschaften für Felder zuzuordnen. Hinweis: Da unsere Datenbank Objektzustand speichern, eine vollständige Darstellung muß und es daher wahrscheinlich ist, daß es mehr Felder in der Datenbanktabelle, als eine gegebene Klasse öffentliche Eigenschaften verfügt. In einigen Fällen kann eine öffentliche Eigenschaft nicht direkt entsprechendes Feld haben, aber im Allgemeinen gilt ordnen Sie eine Eigenschaft auf ein Datenbankfeld ähnliche grundlegende Art (Zeichen, numerisch, Datum etc.).
Jetzt erweitern Sie wir unsere grundlegende Framework-Klassen zur Unterstützung von Objektdauerhaftigkeit. Unser Problem Domain-Objekte (TPDObject) müssen andere Klassen zu zwingen, laden oder Speichern ihres Staates zu ermöglichen. Es gibt eine Reihe von alternativen Möglichkeiten der Annäherung an diese Situation; eine soll zwingen alle Objekte implizit ihre Zustand speichern, bevor sie zerstört werden. In der Praxis-Anwendungen erfordern eine feinere Steuerung, wenn der Zustand des Objekts beibehalten werden soll und so unsere TPDObject Gewinn wird zwei neue öffentliche Methoden, laden und speichern. Die Save-Methode ist parameterlosen, aber unsere Load-Methode muss definieren, genau welches Objekt aus beständigen Speicher geladen werden. Unsere Rahmen werden alle Problem Domain-Objekte, die gespeichert wurden eine eindeutige ID in einem gegebenen Kontext zugeordnet (Dies könnte innerhalb von Objekten derselben Klasse, Objekte die gleiche Abstammung, der Anwendung oder allgemein). Wir verwenden diese ID als Parameter für die Load-Methode, um über die Mittel zu standardisieren, mit denen wir Objektidentität herzustellen. Beachten Sie, dass dies immer verwendet wird, auch wenn eine bestimmte Klasse eine geeignete Alternative 'Primärschlüssel' haben könnte Konzept. Standardisierung auf ein einheitliches Konzept der Objektidentität eignet, wie unser Framework diese Konsistenz verwenden kann, um unser Problem Domain-Objekte in eine generische und polymorphe Art zu behandeln. Einige könnten das Vorhandensein einer öffentlichen Eigenschaft (wenn auch schreibgeschützt) Frage, die eine Art ausgewählt für Bequemlichkeit angepasst die Interna unseres Frameworks verfügbar macht. In der Praxis ist die Identifikation von Objekten nach ID tritt fast ausschließlich innerhalb der Framework-Code und ist innerhalb der eigentlichen Anwendungslogik selbst selten anzutreffen. In dieser Arena werden Objekte mit viel vertrauter an den Endverbraucher, wie z. B. 'die Menge von Kunden namens Smith', anstatt durch entwicklerorientierten Kurzfassungen Konzepte behandelt.
Nach der Definition der Schnittstelle öffentliche Methode auf unserer TPDObject Problem Domain-Klasse muss nun die Umsetzung bedacht werden. In der Tat ist dies sehr einfach. Wir haben bereits erklärt, dass das Geschäftsobjekt nichts weiß über wie es, nur gespeichert werden, die ein anderes Objekt für diese Aufgabe vorhanden ist. Daher die Umsetzung unserer Persistenz-Methoden auf TPDObject einfach delegieren die Arbeit direkt zu einem anderen Objekt in einem privaten Feld verwiesen. Jeder der diese Methodenaufrufe wird mit Self, parametriert, so dass das Delegierte Objekt weiß, mit welcher Instanz es zu tun hat. In der Tat, wenn ein Problem Domain-Objekt wird angewiesen, speichern (oder laden) selbst, es einfach weist ein anderes Objekt, 'Rette mich'.
Datenmanagement

Die Aufgabe der tatsächlich den Objektstatus speichern, in einer Datenbank fällt auf einen Satz von Klassen in das Daten-Management-Ebene. Wie vorauszusehen war, haben wir eine Klassenhierarchie ermöglicht es uns, wesentliche datenbankunabhängige Funktionalität bereitstellen. Alle unsere Kurse verantwortlich für Datenmanagement, wird von einer abstrakten Klasse TDMObject herabkommen. Diese Klasse stellt eine objektbasierte, datenbankunabhängige Schnittstelle für Datenbankoperationen. Bestimmte Datenbank wird unterstützt durch eine konkrete Abkömmling dieser Klasse, die eine Verbindung zur Datenbank der Wahl mit unabhängig von der Technologie ist geeignet und bietet zusätzlich einige Basisdienste erstellen. Diese Basisdienste werden den Besonderheiten der betreffenden Datenbank völlig angepasst werden und von den Nachkommen der anwendungsspezifisch maßgeschneidert für den Umgang mit einer bestimmten TPDObject verwendet werden. Dieses Design nicht diktieren, die Mittel, mit denen die TDMObjects mit dem Datenbankmodul kommunizieren: jede Datenbankschicht ist frei zu wählen, die am besten geeignete (am einfachsten/schnellsten)-Technologie. Dies könnte ADO für SQL Server 7, IBExpress für Interbase, BDE für Paradox-Dateien, eine benutzerdefinierte API oder in der Tat es ist möglich, Schnittstelle zu etwas wie ODBC oder CORBA für generische Handling. Meine Präferenz ist, die Verbindung mit einer Datenbank-abhängigen Satz von Komponenten wie diese sind in der Regel bieten die größtmögliche Funktionalität und Geschwindigkeit zu optimieren. Beachten Sie, dass die Auswahl einer Datenbank-abhängige-API die Anwendung läuft mit dieser Datenbank nicht eingeschränkt wird; Es ist möglich, eine Datenbank-abhängige TDMObject Ebene einen anderen zu ersetzen. Die Schnittstelle zu den TDMObject ist rein Objekt basiert, so dass garantiert werden kann, sofern unsere Datenbank-Ebenen die konkreten Methoden korrekt implementieren, die Anwendung identisch ohne Änderungen ausgeführt wird.
Die eigentliche Implementierung der einzelnen Ebenen datenbankspezifische hängt von der betreffenden Datenbank, aber im Allgemeinen für SQL-fähigen Datenbanken lohnt es sich, einen generischen Execute-Befehl bereitstellen, der einen gültigen SQL-Befehl als Parameter annimmt. Sobald wir ein Nachkomme des TDMObject für eine ausgewählte Datenbank haben müssen wir eine Reihe von Nachkommen aus dieser Klasse, die für jeden TPDObject in unserer Anwendung bereitstellen. Diese werden angepasst werden, um eine ganz bestimmte Kombination eine bestimmte Klasse zu speichern, in einer bestimmten Datenbank zu behandeln. Die Details dieser Klassen verlassen sich auf die Funktionen von der Daten-Management-Klasse für die bestimmte Datenbank, aber ein Merkmal ist wichtig: beim Speichervorgang muss liefert die ID des Objekts gespeichert. Der Grund dafür ist, dass in unserem gewählten Modell eine TPDObject keine ID bis das erste Mal, das es gespeichert wird. Ein besonderer Vorteil dieses Modells ist, dass es sehr einfach für das Daten-Management-Layer zu erkennen, ob eine INSERT- oder UPDATE-Typ-Datenbank-Aktion zu generieren muss. In der Regel die Zuweisung der ID könnte getan werden, von einem anderen Objekt ausschließlich für diesen Zweck konzipiert, aber es gibt eine sehr vorteilhafte Optimierung, die gemacht werden kann, wenn wir auf unsere Daten Management-Objekt zum Ausführen dieser Aufgabe für uns verlassen. Denken Sie daran, dass unsere ID in einem gegebenen Kontext eindeutig sein muss; Wenn der Kontext gewählt, dass Objekte derselben Klasse einzigartige IDs, dann dies zu Datensätzen in der Tabelle unter einzigartigen gleichgesetzt werden kann IDs Die meisten Datenbanken haben einige Anlage zur Erzeugung von sequenziellen eindeutige IDs für Datensätze eingefügt, und dieser Wert nach dem Datenbank-Update zur Verfügung stellen. Verwendung dieser Anlage innerhalb unserer Daten-Management-Layer kann vermeiden Sie replizieren die Bemühungen um die Eindeutigkeit zu gewährleisten, und im besten Fall sparen auf überflüssige Datenbankoperationen herstellen die nächste verfügbare ID. Falls die gewählte Datenbank solche Features kann eine interne ID Zuweisung Schema innerhalb der Daten-Hierarchie verwendet werden.
Listing 1 zeigt die Erweiterungen unserer Einheit Framework unterstützen Load und Speichervorgänge, zusammen mit dem Umriss einer Klasse behandeln Datenzugriff auf eine Datenbank über ADO. Es wird davon ausgegangen, dass die ADO-Verbindung hergestellt wurde und Dienstprogrammroutinen innerhalb der Klasse SQL‑Befehle ausführen und wieder behandeln die empfangenen Daten bereitgestellt werden. In dieser Implementierung sind die untergeordnete Klassen erforderlich, die Load-Methode überschrieben, und auch eine neue INSERT- und Update-Implementierung bereitstellen. Es ist ziemlich leicht zu sehen, dass diese drei Methoden sollte entsprechende SQL-Code generieren und aktualisieren Sie das Objekt aus dem Resultset-Objekt (oder umgekehrt). Mit ein bisschen mehr Aufwand ist es möglich innerhalb der generischen TADO_DMObject Klasse selbst, zur Einführung einer steifere Oberfläche auf Nachfolgerklassen, die weniger Umsetzung erfordert mehr Arbeit zu machen. Ein Beispiel hierfür wäre die Vorgänger-Klasse SQL generieren dynamisch, Befehlen angegebenen Menge von Eigenschaftsnamen und Werte.
Unsere klassenspezifische Daten-Management-Objekte (z. B. TCustomerDM, entspricht 'tCustomer') müssen intime Kenntnisse über die Interna des PD-Objekts, für die es zuständig ist. In diesem Sinne können sie als 'Freund' Klassen des Objekts Domain Problem betrachtet werden, und in Delphi das bedeutet, dass die Implementierungen in derselben Einheit sein müssen.
Dieser Artikel problem
Unser Design erfordert eine TDMObject für jeden TPDObject gewährt wird. Wo und wann könnte diese Bestimmung statt? Was ist dieses Problem bei diesem Ansatz, und durch die Analyse des Musters der Methodenaufrufe an unserer TDMObjects, wie kann es werden umgangen?
(((Listing 1 - Daten-Management-Objekte und Schnittstellen)))
Einheit Framework;
Schnittstelle
Typ
TDMObject = Klasse;
TPDObject = Klasse
Private
DMObject: TDMObject;
FID: TObjectID;
öffentliche
Verfahren Load (const-ID: TObjectID);
Verfahren sparen;
Ende;
TDMObject = Klasse
öffentliche
Load-Prozedur (PDObject: TPDObject; const-ID: TObjectID); virtuellen; Zusammenfassung;
Save-Funktion (PDObject: TPDObject): TObjectID; virtuellen; Zusammenfassung;
Ende;
TADO_DMObject = Class (TDMObject);
Private
FADO: TADOExpress;
geschützt
Funktionen, die Nachkommen zur Interaktion mit der Datenbank
Prozedur Execute (SQL: String);
Eigenschaft ADO: TADOExpress lesen FADO;
Methoden, die Nachkommen bereitstellen muss
Insert-Funktion (const PDObject: TPDObject): TObjectID; virtuellen; Zusammenfassung;
Prozedur Update (const PDObject: TPDObject); virtuellen; Zusammenfassung;
öffentliche
Save-Funktion (PDObject: TPDObject): TObjectID; außer Kraft setzen;
Ende;
Umsetzung
Procedure TPDObject.Load (const-ID: TObjectID);
beginnen
Geltend zu machen (DMObject <> NULL, 'No Data Management Objekt verfügbar');
DMObject.Load (Self, ID);
Ende;
Prozedur TDMObject.Save;
beginnen
Geltend zu machen (DMObject <> NULL, 'No Data Management Objekt verfügbar');
FID: = DMObject.Save (Self);
Ende;
Funktion TADO_DMObject.Save (PDObject: TPDObject): TObjectID;
beginnen
Wenn PDObject.ID = NotAssigned, dann beginnen
Ergebnis: = Einfügen (PDObject);
anderes Ende beginnen
Update (PDObject);
Ergebnis: = PDObject.ID;
Ende;
Ende;
Ende.
(((Ende Codebeispiel 1)))
Weiter in Serie









Persistenter Objekte


Persistenter Objekte : Mehreren tausend Tipps, um Ihr Leben einfacher machen.


Objektdaten müssen letztlich in einer Datenbank gespeichert werden. Dieser Artikel zeigt Ihnen wie.
Persistenter Objekte
In den letzten Artikeln haben wir eingeführt, Business Objects und gezeigte, wie einfache Beziehungen dargestellt werden können. Ausgedrückt als Objekteigenschaften Beziehungen sind eine formale (und neutral) Darstellung der Beziehungen zwischen Datenentitäten, die innerhalb des Datenbankentwurfs implizite oder explizite innerhalb des Datenbankschemas werden können. Abkehr von einer Daten-zentrierte Ansicht von Entitäten und Beziehungen auf eine besser strukturierte, objektorientierte Ausstellung hat viele Vorteile, aber die meisten Sprachen (einschließlich Delphi) sorgen nur für ein Objekt im Speicher-Modell; Objekte haben keine Zustand-Ausdauer-Funktion, wenn man für sie bereitgestellt wird.
Es gibt viele Design-Lösungen zu diesem Problem und wir haben bereits festgestellt, daß die Geschäftsobjekte (Problemdomäne) sich nicht direkt mit der Datenbank kommunizieren soll. Eine angemessene Gestaltung ist einen anderen Satz von Klassen, die rein als Objektschnittstelle zur Datenbank vorhanden und werden zum Laden und Speichern von Domäne-Objekt Problemzustand verantwortlich. Unser Problem Domain-Objekte werden wissen nichts über wie ihren Zustand auf der Festplatte nur gespeichert werden, gibt es eine besondere Klasse, die für diesen Vorgang verantwortlich ist. Die Geschäftsobjekte werden eine Methode aufrufen, die auf ein solches Objekt und delegieren die Arbeit zu machen.
Die erste Entscheidung, die getroffen werden muss ist zu entscheiden, wie Objekte auf ein Datenbankschema zugeordnet werden. Obwohl es eine Reihe von Objektdatenbanken gibt, haben die meisten Unternehmen auf einem vorhandenen RDBMS standardisiert, mit denen sie bequem und erfahrener sind. Eine Änderung der Entwicklung zu einem stärker objektorientierten Ansatz zu fördern ist schwierig genug, ohne zu fordern, dass die in der Regel große Investition in eine hoch entwickelte Datenbanktechnologie für eine neue, ungewohnte repliziert wird. Daher konzentriert sich dieser Artikel auf Zuordnung zu einem SQL-basierten RDBMS, Objekte, als dies die meisten installierten Entwicklungssysteme darstellt. Es sollte jedoch betont werden, daß einer der Vorteile unseres Objekt-Modells ist, dass es völlig Architektur-Neutral und kann auf eine große Anzahl von verschiedenen Datenbank-Topologien, einschließlich ISAM und objektbasierte Einsen angewendet werden.
Zuordnung von Objekten zu Datenbanken
Es ist offensichtlich und natürlich, dass es eine relativ einfache konzeptionelle Beziehung zwischen einem Objekt und einem Datenbank-Tupel (Datensatz gibt). Beim Speichern von Objektzustand in einem RDBMS ist daher eine sehr verbreitet und praktische Lösung eine Domäne Problemklassen Tabellen, Objekte zu Datensätzen und Eigenschaften für Felder zuzuordnen. Hinweis: Da unsere Datenbank Objektzustand speichern, eine vollständige Darstellung muß und es daher wahrscheinlich ist, daß es mehr Felder in der Datenbanktabelle, als eine gegebene Klasse öffentliche Eigenschaften verfügt. In einigen Fällen kann eine öffentliche Eigenschaft nicht direkt entsprechendes Feld haben, aber im Allgemeinen gilt ordnen Sie eine Eigenschaft auf ein Datenbankfeld ähnliche grundlegende Art (Zeichen, numerisch, Datum etc.).
Jetzt erweitern Sie wir unsere grundlegende Framework-Klassen zur Unterstützung von Objektdauerhaftigkeit. Unser Problem Domain-Objekte (TPDObject) müssen andere Klassen zu zwingen, laden oder Speichern ihres Staates zu ermöglichen. Es gibt eine Reihe von alternativen Möglichkeiten der Annäherung an diese Situation; eine soll zwingen alle Objekte implizit ihre Zustand speichern, bevor sie zerstört werden. In der Praxis-Anwendungen erfordern eine feinere Steuerung, wenn der Zustand des Objekts beibehalten werden soll und so unsere TPDObject Gewinn wird zwei neue öffentliche Methoden, laden und speichern. Die Save-Methode ist parameterlosen, aber unsere Load-Methode muss definieren, genau welches Objekt aus beständigen Speicher geladen werden. Unsere Rahmen werden alle Problem Domain-Objekte, die gespeichert wurden eine eindeutige ID in einem gegebenen Kontext zugeordnet (Dies könnte innerhalb von Objekten derselben Klasse, Objekte die gleiche Abstammung, der Anwendung oder allgemein). Wir verwenden diese ID als Parameter für die Load-Methode, um über die Mittel zu standardisieren, mit denen wir Objektidentität herzustellen. Beachten Sie, dass dies immer verwendet wird, auch wenn eine bestimmte Klasse eine geeignete Alternative 'Primärschlüssel' haben könnte Konzept. Standardisierung auf ein einheitliches Konzept der Objektidentität eignet, wie unser Framework diese Konsistenz verwenden kann, um unser Problem Domain-Objekte in eine generische und polymorphe Art zu behandeln. Einige könnten das Vorhandensein einer öffentlichen Eigenschaft (wenn auch schreibgeschützt) Frage, die eine Art ausgewählt für Bequemlichkeit angepasst die Interna unseres Frameworks verfügbar macht. In der Praxis ist die Identifikation von Objekten nach ID tritt fast ausschließlich innerhalb der Framework-Code und ist innerhalb der eigentlichen Anwendungslogik selbst selten anzutreffen. In dieser Arena werden Objekte mit viel vertrauter an den Endverbraucher, wie z. B. 'die Menge von Kunden namens Smith', anstatt durch entwicklerorientierten Kurzfassungen Konzepte behandelt.
Nach der Definition der Schnittstelle öffentliche Methode auf unserer TPDObject Problem Domain-Klasse muss nun die Umsetzung bedacht werden. In der Tat ist dies sehr einfach. Wir haben bereits erklärt, dass das Geschäftsobjekt nichts weiß über wie es, nur gespeichert werden, die ein anderes Objekt für diese Aufgabe vorhanden ist. Daher die Umsetzung unserer Persistenz-Methoden auf TPDObject einfach delegieren die Arbeit direkt zu einem anderen Objekt in einem privaten Feld verwiesen. Jeder der diese Methodenaufrufe wird mit Self, parametriert, so dass das Delegierte Objekt weiß, mit welcher Instanz es zu tun hat. In der Tat, wenn ein Problem Domain-Objekt wird angewiesen, speichern (oder laden) selbst, es einfach weist ein anderes Objekt, 'Rette mich'.
Datenmanagement

Die Aufgabe der tatsächlich den Objektstatus speichern, in einer Datenbank fällt auf einen Satz von Klassen in das Daten-Management-Ebene. Wie vorauszusehen war, haben wir eine Klassenhierarchie ermöglicht es uns, wesentliche datenbankunabhängige Funktionalität bereitstellen. Alle unsere Kurse verantwortlich für Datenmanagement, wird von einer abstrakten Klasse TDMObject herabkommen. Diese Klasse stellt eine objektbasierte, datenbankunabhängige Schnittstelle für Datenbankoperationen. Bestimmte Datenbank wird unterstützt durch eine konkrete Abkömmling dieser Klasse, die eine Verbindung zur Datenbank der Wahl mit unabhängig von der Technologie ist geeignet und bietet zusätzlich einige Basisdienste erstellen. Diese Basisdienste werden den Besonderheiten der betreffenden Datenbank völlig angepasst werden und von den Nachkommen der anwendungsspezifisch maßgeschneidert für den Umgang mit einer bestimmten TPDObject verwendet werden. Dieses Design nicht diktieren, die Mittel, mit denen die TDMObjects mit dem Datenbankmodul kommunizieren: jede Datenbankschicht ist frei zu wählen, die am besten geeignete (am einfachsten/schnellsten)-Technologie. Dies könnte ADO für SQL Server 7, IBExpress für Interbase, BDE für Paradox-Dateien, eine benutzerdefinierte API oder in der Tat es ist möglich, Schnittstelle zu etwas wie ODBC oder CORBA für generische Handling. Meine Präferenz ist, die Verbindung mit einer Datenbank-abhängigen Satz von Komponenten wie diese sind in der Regel bieten die größtmögliche Funktionalität und Geschwindigkeit zu optimieren. Beachten Sie, dass die Auswahl einer Datenbank-abhängige-API die Anwendung läuft mit dieser Datenbank nicht eingeschränkt wird; Es ist möglich, eine Datenbank-abhängige TDMObject Ebene einen anderen zu ersetzen. Die Schnittstelle zu den TDMObject ist rein Objekt basiert, so dass garantiert werden kann, sofern unsere Datenbank-Ebenen die konkreten Methoden korrekt implementieren, die Anwendung identisch ohne Änderungen ausgeführt wird.
Die eigentliche Implementierung der einzelnen Ebenen datenbankspezifische hängt von der betreffenden Datenbank, aber im Allgemeinen für SQL-fähigen Datenbanken lohnt es sich, einen generischen Execute-Befehl bereitstellen, der einen gültigen SQL-Befehl als Parameter annimmt. Sobald wir ein Nachkomme des TDMObject für eine ausgewählte Datenbank haben müssen wir eine Reihe von Nachkommen aus dieser Klasse, die für jeden TPDObject in unserer Anwendung bereitstellen. Diese werden angepasst werden, um eine ganz bestimmte Kombination eine bestimmte Klasse zu speichern, in einer bestimmten Datenbank zu behandeln. Die Details dieser Klassen verlassen sich auf die Funktionen von der Daten-Management-Klasse für die bestimmte Datenbank, aber ein Merkmal ist wichtig: beim Speichervorgang muss liefert die ID des Objekts gespeichert. Der Grund dafür ist, dass in unserem gewählten Modell eine TPDObject keine ID bis das erste Mal, das es gespeichert wird. Ein besonderer Vorteil dieses Modells ist, dass es sehr einfach für das Daten-Management-Layer zu erkennen, ob eine INSERT- oder UPDATE-Typ-Datenbank-Aktion zu generieren muss. In der Regel die Zuweisung der ID könnte getan werden, von einem anderen Objekt ausschließlich für diesen Zweck konzipiert, aber es gibt eine sehr vorteilhafte Optimierung, die gemacht werden kann, wenn wir auf unsere Daten Management-Objekt zum Ausführen dieser Aufgabe für uns verlassen. Denken Sie daran, dass unsere ID in einem gegebenen Kontext eindeutig sein muss; Wenn der Kontext gewählt, dass Objekte derselben Klasse einzigartige IDs, dann dies zu Datensätzen in der Tabelle unter einzigartigen gleichgesetzt werden kann IDs Die meisten Datenbanken haben einige Anlage zur Erzeugung von sequenziellen eindeutige IDs für Datensätze eingefügt, und dieser Wert nach dem Datenbank-Update zur Verfügung stellen. Verwendung dieser Anlage innerhalb unserer Daten-Management-Layer kann vermeiden Sie replizieren die Bemühungen um die Eindeutigkeit zu gewährleisten, und im besten Fall sparen auf überflüssige Datenbankoperationen herstellen die nächste verfügbare ID. Falls die gewählte Datenbank solche Features kann eine interne ID Zuweisung Schema innerhalb der Daten-Hierarchie verwendet werden.
Listing 1 zeigt die Erweiterungen unserer Einheit Framework unterstützen Load und Speichervorgänge, zusammen mit dem Umriss einer Klasse behandeln Datenzugriff auf eine Datenbank über ADO. Es wird davon ausgegangen, dass die ADO-Verbindung hergestellt wurde und Dienstprogrammroutinen innerhalb der Klasse SQL‑Befehle ausführen und wieder behandeln die empfangenen Daten bereitgestellt werden. In dieser Implementierung sind die untergeordnete Klassen erforderlich, die Load-Methode überschrieben, und auch eine neue INSERT- und Update-Implementierung bereitstellen. Es ist ziemlich leicht zu sehen, dass diese drei Methoden sollte entsprechende SQL-Code generieren und aktualisieren Sie das Objekt aus dem Resultset-Objekt (oder umgekehrt). Mit ein bisschen mehr Aufwand ist es möglich innerhalb der generischen TADO_DMObject Klasse selbst, zur Einführung einer steifere Oberfläche auf Nachfolgerklassen, die weniger Umsetzung erfordert mehr Arbeit zu machen. Ein Beispiel hierfür wäre die Vorgänger-Klasse SQL generieren dynamisch, Befehlen angegebenen Menge von Eigenschaftsnamen und Werte.
Unsere klassenspezifische Daten-Management-Objekte (z. B. TCustomerDM, entspricht 'tCustomer') müssen intime Kenntnisse über die Interna des PD-Objekts, für die es zuständig ist. In diesem Sinne können sie als 'Freund' Klassen des Objekts Domain Problem betrachtet werden, und in Delphi das bedeutet, dass die Implementierungen in derselben Einheit sein müssen.
Dieser Artikel problem
Unser Design erfordert eine TDMObject für jeden TPDObject gewährt wird. Wo und wann könnte diese Bestimmung statt? Was ist dieses Problem bei diesem Ansatz, und durch die Analyse des Musters der Methodenaufrufe an unserer TDMObjects, wie kann es werden umgangen?
(((Listing 1 - Daten-Management-Objekte und Schnittstellen)))
Einheit Framework;
Schnittstelle
Typ
TDMObject = Klasse;
TPDObject = Klasse
Private
DMObject: TDMObject;
FID: TObjectID;
öffentliche
Verfahren Load (const-ID: TObjectID);
Verfahren sparen;
Ende;
TDMObject = Klasse
öffentliche
Load-Prozedur (PDObject: TPDObject; const-ID: TObjectID); virtuellen; Zusammenfassung;
Save-Funktion (PDObject: TPDObject): TObjectID; virtuellen; Zusammenfassung;
Ende;
TADO_DMObject = Class (TDMObject);
Private
FADO: TADOExpress;
geschützt
Funktionen, die Nachkommen zur Interaktion mit der Datenbank
Prozedur Execute (SQL: String);
Eigenschaft ADO: TADOExpress lesen FADO;
Methoden, die Nachkommen bereitstellen muss
Insert-Funktion (const PDObject: TPDObject): TObjectID; virtuellen; Zusammenfassung;
Prozedur Update (const PDObject: TPDObject); virtuellen; Zusammenfassung;
öffentliche
Save-Funktion (PDObject: TPDObject): TObjectID; außer Kraft setzen;
Ende;
Umsetzung
Procedure TPDObject.Load (const-ID: TObjectID);
beginnen
Geltend zu machen (DMObject <> NULL, 'No Data Management Objekt verfügbar');
DMObject.Load (Self, ID);
Ende;
Prozedur TDMObject.Save;
beginnen
Geltend zu machen (DMObject <> NULL, 'No Data Management Objekt verfügbar');
FID: = DMObject.Save (Self);
Ende;
Funktion TADO_DMObject.Save (PDObject: TPDObject): TObjectID;
beginnen
Wenn PDObject.ID = NotAssigned, dann beginnen
Ergebnis: = Einfügen (PDObject);
anderes Ende beginnen
Update (PDObject);
Ergebnis: = PDObject.ID;
Ende;
Ende;
Ende.
(((Ende Codebeispiel 1)))
Weiter in Serie


Persistenter Objekte

Persistenter Objekte : Mehreren tausend Tipps, um Ihr Leben einfacher machen.
Persistenter Objekte
Wiezutun
Freunden empfehlen
  • gplus
  • pinterest

Kommentar

Einen Kommentar hinterlassen

Wertung