Verwenden wir das richtige Repository-Muster?

14

Wir verwenden eine Reihe separater Klassen, an die das Suffix angehängt ist -repository, um die Daten aus der Datenbank abzurufen. für jede Tabelle ein eigenes Repository.

Wir haben zum Beispiel eine customerrepositoryKlasse, die alle Arten von Methoden zum Abrufen von Kunden hat, und eine Klasse, die vacancyrepositoryalle Arten von Methoden zum Abrufen von Stellenangeboten hat.

Ich habe zwei Fragen zu dieser Arbeitsweise:

  1. Wie wäre es mit Daten, die sich über mehrere Tabellen erstrecken? Zum Beispiel habe ich einen Bildschirm, auf dem alle Kunden angezeigt werden, die noch keine Vakanz erstellt haben. Kann customerrepositoryman Methoden aus dem vacancyrespositoryoder beiden Repositorys verwenden, um Ergebnisse zurückzugeben, und gibt es eine Klasse in der Hierarchie (nennen wir sie a dataservice), die die Ergebnisse aus beiden Repositorys abruft und sie zu einem Ergebnis kombiniert?

  2. Wie viel Logik kann ein solches Repository bewältigen?
    Ich denke, es ist in Ordnung, das 'where active == true' in einem Repository zu implementieren, um nur aktive Datensätze abzurufen, oder sollte auch diese einfache Logik von einer höheren Klasse in der Hierarchie behandelt werden (nennen wir es a dataservice)?

Das Beispiel, in das ich jetzt geraten bin, ist das folgende:

Wir haben eine Fragenliste, die eine oder mehrere Fragen enthält.
Die Frage kann ein Ergebnis haben, das in einer separaten Tabelle festgehalten wird.
Wenn Sie also das Gesamtergebnis der Fragenliste abrufen möchten, müssen Sie Daten aus der questionlistTabelle, der Fragentabelle und der questionstatusTabelle kombinieren .

Im Moment haben wir 3 verschiedene Repositories für diese Tabellen.

Wenn ich die Frage stellen würde, questionlistrepositorywie hoch das Gesamtergebnis für Liste Nr. 12 ist, müsste es Daten aus zwei anderen Repositorys abrufen und daher eine Logik enthalten. Ist das zulässig?

Oder gibt es einen, questionlistdataserviceder weiß, welche Repositories er verwenden soll?

Eine weitere Sache: Unsere Repositorys können dazu führen, IQueryabledass ein aufrufender Service die Ergebnisse leicht kombiniert. Wenn dies jedoch nicht der Fall ist, ist es meiner Meinung nach keine gute Idee, den gesamten Inhalt aller drei Tabellen aus der abzurufen Datenbank.

Michel
quelle
1
Typischerweise wird bei mehreren Tabellenzugriffen die dominante Tabelle durch die Tabelle des Datensatzes bestimmt, die vorhanden sein muss, bevor die Abfrage ihn abruft. In LEFT OUTER JOIN wäre dies die erste Tabelle und in RIGHT OUTER JOIN die zweite.
Neil

Antworten:

15

Das Repository gibt Domänenobjekte zurück und basiert auf Mapping-Layern. Für eine sehr einfache Domäne können Domänenobjekte und Datenbanktabellen sehr ähnlich sein.

Wenn Ihr Repository immer eine exakte Darstellung Ihrer Datenstruktur zurückgibt, handelt es sich möglicherweise tatsächlich um Table Data Gateway, auch bekannt als Data Access Object (DAO).

Beispiel: Ihre Datenbank enthält Tabellen für Person und Adresse. In Ihrer Anwendung ist die Domain-Adresse keine eigene Entität, sondern lediglich eine Eigenschaft von Person. In diesem Fall hätten Sie kein PersonRepository und kein AddressRepository. Sie haben nur PersonRepository. Die Domäne sollte nicht betroffen sein, wie die Domänendaten beibehalten werden. Diese Zuständigkeiten liegen in einer Ebene hinter dem Repository.

Aus Ihrem Beispiel geht hervor, dass Sie tatsächlich DAOs haben und diese soeben als Repositorys bezeichnet haben.

Simoraman
quelle
Wenn ich also ein Repository erstelle, kann ich auch ein Table Data Gateway haben, das eine Ebene tiefer liegt, und unsere Repositorys sind eigentlich TDGs.
Michel
1
Sie könnten aber die Kosten und den Nutzen abwägen. Lassen Sie sich nicht dazu zwingen, DAOs und Repositorys durch das Prinzip der Code- "Schichtung" voneinander zu trennen. Tun Sie in diesem Fall, was am besten lesbar ist. Die Trennung und die resultierende Abstraktionsschicht können nützlich sein, wenn Ihre Repositorys dazu neigen, die Daten in den DAOs häufig zu rekombinieren.
Mihai Danila