Ich habe derzeit eine Reihe von Datenzugriffsobjekten mit der Konvention *SlickRepo
. Also zum Beispiel, UserSlickRepo
, DistributionSlickRepo
, ContentSlickRepo
, etc ...
Jedes dieser Repos hat Methoden, die grundsätzlich dieser Konvention folgen:
%Vor%Jetzt auf einer Service-Ebene backen wir in dieser Repo-Klasse und wir haben Methoden, die wie folgt aussehen:
%Vor% Wir möchten nun, dass createSomethingGood
tatsächlich die zwei Repomethoden innerhalb einer Transaktion ausführt. Da alle Slick-Sachen in den Slick-spezifischen Repo-Methoden eingeschlossen sind, was ist der beste Weg, dies zu tun? Ich bin nicht gegen slick-spezifischen Code in meinen *ServiceImpl
-Klassen (ich meine seltsam, aber ok), aber das bedeutet, dass ich meine Repo-Klassen ändern müssen, um den getDatabase withDynSession
-Typ-Code alle zusammen zu entfernen und stattdessen bestehen in einer Sitzung von der Service-Schicht? Das scheint mir einfach falsch zu sein.
Aus meiner Sicht ist der richtige Ansatz, createSomething
und createSomethingElse
zu einer *Repo
( SomethingRepo
oder SomethingElseRepo
) Transaktionsart ( withTransaction {...}
) hinzuzufügen. Es ist keine schöne Lösung, aber so einfach wie möglich für mich und weil diese Entitäten logisch verbunden sind (was wir aus diesem Code sehen können (dep.somethingRepo.createSomething, dep.somethingElseRepo.createSomethingElse)
) Ich denke, es ist kein großer Verstoß, den Vorgang auf 2 Entitäten in einer DAO-Klasse zu mischen. Bitte, repariere mich, wenn ich falsch liege.
Vielleicht gibt es einen anderen Weg. Ich habe es selbst nicht versucht, aber die Idee ist, dass Sie einen Session-Wrapper haben könnten, der tatsächlich an den Repo übergeben wird.
Dieser Wrapper müsste auf der Service-Ebene erstellt werden, aber Sie können die spezifische Implementierung auf einem Companion-Objekt abstrahieren, so dass die Service-Schicht nicht mit Slick, sondern eher mit
zurechtkommt %Vor%Ich hoffe, das hilft, ich werde mehr zur Antwort hinzufügen, wenn ich die Änderung bekomme, um es selbst zu versuchen.