Wir haben drei Schichten in unserer Anwendung. Service-Schicht zur Bereitstellung einer externen API. BO-Schicht für unsere Geschäftslogik und DAO-Schicht für unsere Datenbankverbindung.
Angenommen, wir möchten jedes Mal, wenn wir eine Datei aktualisieren, auch etwas im Ordner ändern, z. B. das Datum der letzten Änderung. Dies muss in einer Transaktion erfolgen. Entweder ist es erfolgreich und sowohl Datei als auch Ordner werden bearbeitet. Oder es liegt ein Fehler vor und die Transaktion wird zurückgesetzt, sodass sich beide Objekte im vorherigen Status befinden.
Die Aktion "Ordner bearbeiten, wenn eine Datei bearbeitet wird" ist reine Geschäftslogik. Das würde also bedeuten, dass es in die BO-Schicht gehört. Wir verwenden jedoch Objectify für unsere Datenbank. Um eine Transaktion zu starten, müssen wir ofy (). Transact (...) aufrufen. Wenn wir diese Funktion in der BO-Schicht aufrufen, bricht dies unser Design, da es in unserer Business-Schicht datenbankspezifische Aufrufe (Objectify) gibt.
Was wäre eine saubere Lösung für dieses Problem?
quelle
FileBO
anrufenFolderBO.edit(newDate)
?Antworten:
Wie Sie Ihre Transaktionen kürzen, ist in der Tat Geschäftslogik. Lassen Sie also Ihre DAO-Schicht eine db-Framework-unabhängige API für die von
transact
Ihnen erwähnte Methode (und wahrscheinlich für Dinge wiecommit
undrollback
) bereitstellen . Dann können Sie es von Ihrer BO-Ebene aus verwenden, ohne es von Ihrer Datenbank oder Ihrem Datenbank-Framework abhängig zu machen.quelle
Es sieht so aus, als ob Objectify für atomähnliche Transaktionen ( Google Application Engine-Transaktionen ) entwickelt wurde. Sie müssen eine eigene Abstraktion des Transaktionsmanagements entwickeln .
In diesem Fall. Die Abstraktion geht weiter. Wie delegiere ich das Transaktionsmanagement an die oberen Ebenen?
Der @ DocBrown-Ansatz sieht für mich die schnellere und sauberere Lösung für die Implementierung in die angegebene Architektur ( Layered Architecture ).
Da wir zu viele Informationen über die Anwendung und ihren Kontext vermissen, scheint mir die Lösung von Doc auch die sicherste zu sein.
Ich würde jedoch empfehlen, einen Blick auf das UnitOfWork- Entwurfsmuster für die Business-Ebene zu werfen . Ich denke, es passt zum Transaktionsmanagement von Objectify .
Kurz zusammengefasst zielt das Muster darauf ab, Geschäftsregeln in Geschäftstransaktionen (Arbeitseinheiten) zu kapseln . Das Muster erlaubt die Vererbung zwischen B.Ts und soweit ich sehe, auch Objectify . Es unterstützt sogar die Komposition. Also entweder durch die Zusammensetzung oder Vererbung ermöglicht es der Ansatz komplexen B.Ts .
Auf die gegebene Architektur angewendet, würde aussehen wie:
quelle