Warum wird das Repository-Muster in NHibernate benötigt?

13

Ich lese die offizielle Ihre erste NHibernate-basierte Anwendung .

Obwohl das Tutorial gut und leicht zu befolgen ist, frage ich mich, warum das Repository-Muster verwendet wird.

In den verschiedenen Add, Update, RemoveMethoden in der ProductRepositoryImplementierung ist der Code fast identisch - sie alle mit Transaktionen, und der Unterschied ist in dem „Fleisch“ , dh Aufruf session.Saveint das AddVerfahren, session.Deletein dem removeVerfahren. ( Die Seite fehlt HTML - Anker, aber Sie können die Seite für den entsprechenden Code wie suchen public void Remove,public void Add )

Dieser Code "fühlt sich einfach falsch an".

Warum verwendet der Autor das Repository-Muster - dient es nur zur Demonstration der Verwendung von NHibernate oder ist dies erforderlich oder aus einem anderen Grund?

Ps. Mein Hintergrund stammt von Ruby on Rails, das ActiveRecord verwendet. Daher versuche ich zu verstehen, wie NHibernate funktioniert / verwendet wird.

Zabba
quelle
1
Wenn Sie das Muster "Aktive Aufzeichnung" bevorzugen, können Sie Castle Active Record verwenden, um auf NHibernate zu sitzen. Castleproject.org/activerecord
Ben Robinson
3
Dies ist eine kritische Frage. Es wird diskutiert, ob man es verwenden soll oder nicht. Ayende schrieb seine Argumente, es nicht im Repository zu verwenden, ist der neue Singleton

Antworten:

10

Das Repository-Muster ist nicht erforderlich. Wie bei allen anderen Mustern handelt es sich um eine "architektonische" Entscheidung, die Sie gegen Ihre geschäftlichen Anforderungen treffen müssen. Im Allgemeinen wird das Repository-Muster verwendet, um die "Entity Persistance Ingorance" zu implementieren, dh Ihre Entitäten wissen nichts darüber, wie sie sich auf Ihrem Speichergerät (Datenbank, XML, TextFile usw.) persistieren sollen. Wenn Sie zum Beispiel eine Entitätsadresse haben, enthält diese nicht die Persistenzlogik (Sie finden nirgendwo so etwas wie address.Save oder address.Update), aber Sie übergeben Ihre Entität an eine Repository-Methode, die für die Persistenz der Adresse zuständig ist Änderungen

Massimiliano Peluso
quelle
Ich denke ja und nein. Die NHibernate-Sitzung selbst ist eine Art generisches Repository. Das Hinzufügen eines zusätzlichen Repositorys ist im Allgemeinen nichts anderes als das Hinzufügen einer Fassade zum Sitzungsobjekt.
Tatsächlich beginnt meine Antwort wie folgt: "Das Repository-Muster ist nicht erforderlich ..." Es kann nur eine architektonische Entscheidung sein, die sich gegen die geschäftlichen Anforderungen richtet
Dem stimme ich voll und ganz zu. Aber mir hat der Punkt gefehlt, dass die Sitzung selbst ein Repository ist, das ist alles.
9

Die Verwendung des Repository-Musters hat den Vorteil, dass Sie Ihre Datenzugriffsschicht nachahmen, sodass Sie den Code Ihrer Geschäftsschicht testen können, ohne DAL-Code aufrufen zu müssen. Es gibt noch andere große Vorteile, aber das scheint mir sehr wichtig zu sein.


quelle
2
+1 Das ActiveRecord-Muster macht es sehr schwierig, die DAL für die Verspottung zu isolieren, was normalerweise dazu führt, dass Komponententests eine eigene Datenbank erfordern (in diesem Fall wird der Komponententest zu einem Integrationstest).
MattDavey