Frage

Die Ignoranz von Persistenz wird typischerweise als die Fähigkeit definiert, Standard -.NET -Objekte (oder Pocos abzurufen, wenn Sie wirklich darauf bestehen, ihnen einen Namen zu geben). Und ein Scheinbar gut akzeptierte Definition eines Standard -.NET -Objekts ist:

"... gewöhnliche Klassen, in denen Sie sich auf das Geschäftsproblem konzentrieren, ohne Dinge für infrastrukturbezogene Gründe hinzuzufügen ..."

Ich sehe jedoch, dass Menschen, die Nhibernate als einen Rahmen beschreiben, der Persistenz Unwissenheit ermöglicht, und dennoch ein Rahmen, an dem nicht funktionieren kann irgendein Standard .NET -Objekt, nur Standard -.NET -Objekte, die beispielsweise bestimmte Entwurfsanforderungen festhalten (Quelle):

  • Alle Klassen muss einen Standardkonstruktor haben
  • Einige Funktionen funktionieren nicht, es sei denn, die Klassen sind nicht versiegelt und alle Mitglieder sind virtuell
  • Die Objektidentität funktioniert nicht ordnungsgemäß, es sei denn, Sie missbrauchen gleich/gethashcode

(Abgesehen davon: Bevor jemand verärgert ist, möchte ich hier nicht auf NhisperNate auswählen, es ist nur ein häufig zitiert .))

Obwohl die Klasse an sich keine Persistenz-Framework-spezifischen Attribute oder Basisklassen usw. hat, ist es für mich nicht wirklich "Persistenz unwissend" erleichtern Verwendung durch das gewählte Persistenz -Framework. Sie müssen die Klasse mit den Anforderungen des Persistenz -Frameworks entwerfen und umsetzen. Wenn Sie sich darüber nicht bewusst sind, funktioniert die Klasse möglicherweise nicht damit.

Wo ich Probleme mit der Definition von "Persistenz -Unwissenheit"/"Poco" habe, ist, dass ich nicht sehe, wie konzeptionell dies wirklich unterschiedlich ist, als Attribute wie das Hinzufügen von Attributen wie z. [Serializable] oder [DataContract] oder [XmlType] oder andere Persistenz-Framework-spezifische Anmerkungen, die erleichtern Die Persistenz und das Abrufen der Entität unter Verwendung dieses Rahmens.

Was genau ist "Persistenz -Unwissenheit"?

Klar, die Definition davon als in der Lage zu sein, "gewöhnliche Klassen" bestehen zu können -Virtuelle Mitglieder und Equals/Gethashcode -Implementierungen auf veränderlichen Typen.

Ist es daher vernünftig zu sagen, dass "Persistenz-Unwissenheit" wahr ist, wenn Objekte die Verwendung eines Persistenz-Frameworks (entweder in Design und Struktur oder durch Verwendung von Framework-spezifischen Anmerkungen) erleichtern, aber selbst keine Persistenzlogik durchführen?

War es hilfreich?

Lösung

Ich würde behaupten, dass es wie die meisten Dinge eine Rutschale ist. Es gibt Dinge, die wir machen, die das Eigentum der Persistenz haben wollen. An einem Ende der Skala befindet sich dieses Ding mit all den Eingeweiden, Abhängigkeiten und Code, die individuell erstellt wurden, um nur diese eine Sache auf seine besondere Weise zu bestehen. Am anderen Ende der Skala passiert etwas, das einfach auf magische Weise passiert, ohne dass wir viel mehr tun, als ein Token hinzuzufügen oder eine Eigenschaft an einem Ort zu setzen, das das Ding dazu bringt, sich nur bestehen zu lassen. Um auf die magische Seite der Skala zu gelangen, gibt es Rahmenbedingungen, Designrichtlinien, Konventionen usw., die die Magie unterstützen. Ich denke, man könnte argumentieren, dass ein Tool erzeugt werden könnte, das weniger Anforderungen und Einschränkungen hatte als Nhibernate, aber das gleiche Ziel verfolgte. Dieses hypothetische Werkzeug wäre weiter entlang unserer Skala.

Ich weiß nicht, dass ich den Begriff "Persistenz -Unwissenheit" so sehr mag; Es geht wirklich darum, dass ein Objekt die Implementierung, den Backing -Store, den Cache, so etwas weiß - ein Objekt ist sich jedoch in der Regel bewusst, ob es doch hartnäckig ist oder nicht. Aber das ist nur Semantik.

Andere Tipps

Ich glaube nicht, dass Ihr Verständnis (oder Ihre Definition) der "Persistenz -Ingoranz" falsch ist.

Das real Problem ist das von undichte Abstraktionen. Ganz einfach, die vorhandene Technologie macht es sehr Es ist schwierig, echte PI zu implementieren.

Ich stimme MikeB zu - "Persistenance -Unwissenheit" ist eine Schiebung, keine wahre/falsche Eigenschaft eines bestimmten Orms.

Meine Definition von echtem 100% PI wäre, dass Sie eine mögliche POCO -Klasse bestehen könnten, egal wie kompliziert und mit anderen Klassen verbunden sind, ohne die Klasse auf andere Weise in irgendeiner Weise zu ändern.

Hinzufügen von ID -Feldern, Dekorieren mit Attributen, Erben von ORM -Klassen, dem Entwerfen Ihrer Klassen, damit sie gut auf die zugrunde liegenden Tabellen in einem RDB kartieren - alle reduzieren die "PI -Punktzahl" unter 100%.

Das heißt, ich habe mich für die Verwendung von fließendem Nhibernate Automapping entschieden, da es den höchsten PI -Score einer der ORM -Optionen zu haben scheint, die ich mir angesehen habe.

Ich würde Ihrer Definition zustimmen:

Ist es daher vernünftig zu sagen, dass "Persistenz -Unwissenheit" wahr ist, wenn Objekte die Verwendung eines Persistenz -Frameworks erleichtern, aber selbst keine Persistenzlogik durchführen?

Der Code (im Gegensatz zu Attributen) in Ihren Klassen hat keine Funktionen, die für die Beharrlichkeit wesentlich sind. Standardkonstruktoren könnten für die Persistenz benötigt werden, haben jedoch keinen Code, der tatsächlich Persistenz bewirkt. Die Persistenzschicht könnte ziemlich wesentlich geändert werden, verschiedene Datenbanken könnten verwendet werden und die Geschäftslogik würde unverändert bleiben.

Eine anhaltende ignorante Klasse ist eine Klasse, die nicht an einen Persistanz -Rahmen gebunden ist.

Das heißt, die Klasse hat absolut kein Wissen darüber, dass ein Persistanz -Framework vorhanden ist. Sie erbt weder von einer Klasse, die durch diesen Framework definiert ist, noch implementiert sie eine Schnittstelle, die für diesen Beharrlichkeitsframework erforderlich ist, um zu arbeiten.

Während es bestimmte geringfügige Einschränkungen geben kann, dass ein bestimmtes Rahmen für die Persistenz-Ignoranz erforderlich ist, bleibt die Ausdauer-Ignoranz dennoch bestehen.

Während eine Klasse in Ihrem Domänenmodell (transparent mit Nhibernate bestehen) über einen Konstruktor ohne Argumente verfügen muss, damit er "dynamisch" konstruiert werden kann, muss keine bestimmte Basisklasse vom Framework diktiert werden und es ist erforderlich, dass es erforderlich ist, noch zu haben, und es ist erforderlich, dass es erforderlich ist, nicht zu haben oder bestimmte rahmenspezifizierte Methoden überschreiben.

Meiner Meinung nach ist "Persistenz -Unwissenheit" eine Eigenschaft Ihres Modells (Domänenmodell, Geschäftsmodell oder was auch immer Sie als bezeichnen können). Das Modell ist dauerhaft ignorant, weil es Instanzen der Entitäten abruft, die es durch Abstraktionen enthält (manchmal als Repositorys bezeichnet). Diese Abstraktionen kann Wenn Sie direkt ein ORM verwenden, kann dies jedoch manchmal Anforderungen an die Objekte hinzufügen, die natürlich nicht in Ihr Modell gehören. Daher würde ich nicht sagen, dass ein Modell, das sich an einige Anforderungen eines bestimmten ORM hält, zu 100% ige Persistenz ignorant ist.

Sie können PersisRtence -Unwissenheit unter Verwendung einer Klasse für die Domäne oder Ihre Anwendung und eine PoCO -Klasse in der Persistenz implementieren, wenn Sie das Domain -Objekt bestehen müssen

Ihre Domänenklasse muss ignorieren, wie die Informationen bestehen bleiben. Daher dürfen Sie keine Regeln eines Persistenz -Frameworks wie (leerer Konstruktor, virtuelle Eigenschaften usw.) einschließen.

Diese Persistenz -Rahmenregeln können in Ihrer Persistenzklasse liegen.

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