Ist es eine schlechte Praxis, dass der Controller das Repository anstelle des Dienstes aufruft?
um mehr zu erklären:
Ich finde heraus, dass Controller in gutem Design den Service aufrufen und das Service Use Repository verwenden.
aber manchmal in controller habe / brauche ich keine logik und muss nur von db holen und an view übergeben.
und ich kann es tun, indem ich einfach das Repository anrufe - keine Notwendigkeit, den Service anzurufen - ist es eine schlechte Praxis?
design-patterns
object-oriented
mvc
repository
mohsenJsh
quelle
quelle
Antworten:
Nein, stellen Sie es sich so vor: Ein Repository ist (auch) ein Service.
Wenn die Entitäten, die Sie über das Repository abrufen, den größten Teil der Geschäftslogik abwickeln, sind keine weiteren Services erforderlich. Nur das Repository zu haben ist genug.
Auch wenn Sie einige Services haben, die Sie durchlaufen müssen, um Ihre Entitäten zu manipulieren. Holen Sie sich die Entität zuerst aus dem Repository und übergeben Sie sie dann an diesen Service. Es ist sehr praktisch, ein HTTP 404 zu werfen, bevor man es überhaupt versucht.
Auch für Leseszenarien ist es üblich, dass Sie die Entität nur für die Projektion auf ein DTO / ViewModel benötigen. Eine dazwischen liegende Service-Schicht führt dann oft zu einer Menge hässlicher Pass-Through-Methoden.
quelle
Es ist keine schlechte Praxis für einen Controller, ein Repository direkt aufzurufen. Ein "Service" ist nur ein weiteres Tool. Verwenden Sie es also dort, wo es Sinn macht.
NikolaiDante kommentierte:
Ich denke nicht, dass Beständigkeit der wichtigste Aspekt ist. Eine "Service" -Klasse soll eine Logik höherer Ebene kapseln, damit der Controller sie nicht implementieren muss. Wenn für eine bestimmte Operation keine "übergeordnete Logik" erforderlich ist, gehen Sie direkt zum Repository.
Um eine gute Trennung von Bedenken und Testbarkeit zu fördern, sollte das Repository eine Abhängigkeit sein, die Sie über einen Konstruktor in den Service einfügen:
Wenn die Suche nach Datensätzen in der Datenbank eine Art parametrisierte Abfrage erfordert, ist eine Serviceklasse möglicherweise ein guter Ort, um Ihr Ansichtsmodell einzusehen und eine Abfrage zu erstellen, die dann vom Repository ausgeführt wird.
Wenn Sie über ein komplexes Ansichtsmodell für ein Formular verfügen, kann eine Serviceklasse die Logik des Erstellens, Aktualisierens und Löschens von Datensätzen einschließen, indem Methoden für Ihre Domänenmodelle / -entitäten aufgerufen und diese anschließend mithilfe eines Repositorys beibehalten werden.
In die entgegengesetzte Richtung gehen: Wenn Ihr Controller einen Datensatz anhand seiner ID abrufen muss, ist das Delegieren an ein Dienstobjekt wie das Schlagen eines Reißzwecks mit einem Vorschlaghammer - es ist weit mehr als erforderlich.
Ich habe festgestellt, dass der Controller in der besten Position ist, um die Transaktion oder ein Unit Of Work-Objekt abzuwickeln . Der Controller oder das Unit Of Work-Objekt wird dann für komplexe Vorgänge an Serviceobjekte delegiert oder für einfache Vorgänge (z. B. das Suchen eines Datensatzes anhand der ID) direkt an das Repository gesendet.
Ich halte eine Mischung aus Services und direkter Arbeit mit Repositories für absolut akzeptabel. Sie können die Transaktion auch in ein Unit Of Work-Objekt einkapseln, wenn Sie dies für erforderlich halten.
Die Aufteilung der Zuständigkeiten sieht folgendermaßen aus:
quelle
DbContext
ist in diesem Fall ein schlechter Name. Ich werde das ändern. Ich verwende NHibernate, und die Repositorys (oder der Kontext, wenn es praktisch ist) verwalten das Datenbankende der Dinge, sodass das Ändern von Persistenzmechanismen keine Codeänderungen außerhalb des Kontexts erfordert.Das hängt von Ihrer Architektur ab. Ich benutze Spring und die Transaktionsverwaltung erfolgt immer über Dienste.
Wenn Sie Repositorys direkt für Schreibvorgänge aufrufen (oder einfache Dienste ohne Logik, die einfach an das Repository delegieren), verwenden Sie wahrscheinlich mehrere Datenbanktransaktionen für einen Vorgang, der in einem Vorgang ausgeführt werden muss. Dies führt zu inkohärenten Daten in Ihrer Datenbank. In der Regel sollten Datenbankvorgänge funktionieren oder fehlschlagen, aber halbfertige Vorgänge verursachen Kopfschmerzen.
Aus diesem Grund halte ich das Aufrufen von Repositorys direkt von Controllern oder die Verwendung einfacher Delegierungsdienste für eine schlechte Praxis. Sie fangen an, es nur zum Lesen zu tun, und sehr bald werden Sie, einer oder Ihre Freunde, damit beginnen, es für Schreiboperationen zu tun.
quelle