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 customerrepository
Klasse, die alle Arten von Methoden zum Abrufen von Kunden hat, und eine Klasse, die vacancyrepository
alle Arten von Methoden zum Abrufen von Stellenangeboten hat.
Ich habe zwei Fragen zu dieser Arbeitsweise:
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
customerrepository
man Methoden aus demvacancyrespository
oder beiden Repositorys verwenden, um Ergebnisse zurückzugeben, und gibt es eine Klasse in der Hierarchie (nennen wir sie adataservice
), die die Ergebnisse aus beiden Repositorys abruft und sie zu einem Ergebnis kombiniert?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 adataservice
)?
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 questionlist
Tabelle, der Fragentabelle und der questionstatus
Tabelle kombinieren .
Im Moment haben wir 3 verschiedene Repositories für diese Tabellen.
Wenn ich die Frage stellen würde, questionlistrepository
wie 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, questionlistdataservice
der weiß, welche Repositories er verwenden soll?
Eine weitere Sache: Unsere Repositorys können dazu führen, IQueryable
dass 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.
quelle
Antworten:
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.
quelle