2 Stimmen

Verwendet man eine persistente Klasse oder ein persistierbares Basismodell als Architekturwarnung?

Einer der Hauptkritikpunkte der Alt.Net-Community gegen das Microsoft Entity Framework ist, dass es Sie dazu zwingt, ein Base Persistable Object für alles zu verwenden, was in der Datenbank gespeichert wird. Ich habe zwei Fragen dazu:

  1. Ist es akzeptabel, eine "Root Persistent Class" als Basis für die Domänenobjekte in Ihrer Anwendung zu haben, oder ist dies ein Architekturfehler?

  2. Wenn Sie der Meinung sind, dass es in Ordnung ist, eine in Ihrer Anwendung zu haben, ist es auch in Ordnung, wenn ein ORM-Framework Sie dazu zwingt, eine zu verwenden? Gibt es Gründe, ein Framework zu vermeiden, das dies von Ihnen verlangt?

Ich verwende seit einiger Zeit ein abstraktes Basisklasseobjekt als Wurzel aller meiner persistierbaren Klassen. Dadurch werden einige Verwaltungsaufgaben viel einfacher.

2voto

hackerhasid Punkte 11369

Mein Gefühl ist, dass es in Ordnung ist, vorausgesetzt, der Kontext ist so, dass es

  1. aus dem Weg bleibt
  2. keine Funktionen hinzufügt, die außerhalb des Bereichs der Entität nicht verwendet werden
  3. keine Verbindung zu einem bestimmten ORM herstellt (gleichermaßen in Bezug auf #2)

Also, wenn die Basisklasse beispielsweise dazu verwendet wird, um eine ID und die Bedeutung der Gleichheit zu beschreiben (da Entitäten häufig als gleich betrachtet werden, wenn sie dieselbe ID haben), dann ist das in Ordnung. Wenn es jedoch anfängt, datenbankzentrierte Informationen zu beschreiben (wie Tabellen, Spalten, Zustand der Entität usw.), dann ja, denke ich, fängt es an zu riechen.

2voto

Jeff Sternal Punkte 46528

Für Anwendungen mit einem niedrigen bis mittleren Komplexitätsgrad kann die Verwendung eines Basispersistable-Objekts die Entwicklungseffizienz wirklich steigern.

Es begrenzt jedoch Ihren Code und beschränkt die Designoptionen, wenn Ihre Anwendung komplexer wird. Offensichtlich verbrauchen Sie Ihre Basisklasse zu Beginn, was in C# und Java bedeutend ist. Es fördert auch eine schlechte Trennung der Anliegen.

Meiner Meinung nach ist das Wichtigste bei der Überlegung einer ORM, diese Fragen zu stellen (aus Jeremys Millers Artikel Das Unit-of-Work-Muster und das Persistenz-Ignoranz):

  • Kann die Geschäftslogik unabhängig von der Datenbank ausgeführt werden?
  • Kann ich mein Domänenmodell unabhängig vom Datenbankmodell entwerfen?
  • Wie beeinflusst meine Persistenzstrategie meine Geschäftslogik?

1voto

Brett Allen Punkte 5087

Es sei denn, Sie verwenden Data Transfer Objects (DTO) für die Persistenz und verwenden dieses Modell, sodass ein Wurzelobjekt für persistente Klassen meiner Erfahrung nach die Code-Wiederholung erheblich reduziert und die Entwicklerproduktivität erhöht. Selbst bei Verwendung eines DTO denke ich, dass es hilfreich sein könnte, obwohl ich selten DTOs verwende und daher nicht aus Erfahrung sprechen kann.

Ich würde es nicht als Code-Geruch betrachten aus folgenden Gründen:

  1. Steigerung der Produktivität der Entwickler.
  2. Konsolidiert den Persistenzcode in einer Klasse.
  3. Leicht zu einem anderen Framework zu wechseln, das die gleiche Methodik implementiert (nur Vererbung aller Ihrer Geschäftsklassen ändern und Überprüfungen der ursprünglichen Wurzelklasse aktualisieren).

Bearbeitung: Inline statichippo's Antwort, ich stimme seiner Meinung zu, dass diese Basisklasse Informationen über die zugrunde liegenden Datenspeichermechanismen (wie Tabellen-/Spaltennamen, Datenbanktyp usw.) enthalten sollte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X