In einer Webanwendung ist eine Arbeitseinheit für das Transaktionsmanagement verantwortlich.
Aber was ist mit einer Windows-Anwendung?
Soweit ich weiß, ist das Repository das Bindeglied zwischen meiner Datenzugriffsebene und meiner Business-Schicht. Es verbirgt alle Datenzugriffe von meiner Business-Schicht.
Wenn ich diese Tatsache benutze, denke ich darüber nach, alles Transaktionsmaterial in das Repository zu übernehmen.
Aber ich habe gelesen, dass die Verwendung von Commit / RollBack-Methoden im Repository gegen die Absicht des Repositories verstößt.
Ich frage mich, wer für das Transaktionsmanagement in einer Nicht-Web-Anwendung verantwortlich ist und wie ich die Transaktions- / Nhibernate-Daten aus der Business-Schicht verbirge?
Die allgemeine Antwort lautet: "Wer auch immer ISession
instanziiert, sollte darüber verfügen. Wenn die Transaktion nicht festgeschrieben wurde, ist dies effektiv ein Rollback."
Ich hatte Erfolg, indem ich mit dem Befehlsmuster eine Operation definierte, die ich auf einer Arbeitseinheit ausführen wollte. Nehmen wir an, wir haben eine Entität Person
und eines der Dinge, die wir tun können, ist den Namen einer Person zu ändern. Fangen wir mit der Entität an:
Definieren Sie einen einfachen POCO-Befehl wie folgt:
%Vor%... und ein Handler für den Befehl:
%Vor%Das Ziel ist, dass Code, der außerhalb eines Session / Work-Bereichs existiert, etwas wie folgt tun kann:
%Vor%Der Aufruf des Befehls bedeutet "tue diesen Befehl für eine Arbeitseinheit". Dies ist, was wir wollen, wenn wir den Befehl aufrufen:
IHandle<ChangeNameCommand>
aus dem IoC-Bereich Hier ist ein Beispiel mit Autofac als IoC-Container:
%Vor% Hinweis: Das UnitOfWorkInvoker
, das ich hier gezeigt habe, verstößt gegen SRP - es ist ein UnitOfWorkFactory
, a UnitOfWork
und Invoker
alles in einem. In meiner tatsächlichen Implementierung habe ich sie ausgebrochen.
Wenn ich Repositories verwende, sind sie in einer Arbeitseinheit enthalten. Die Arbeitseinheit verfolgt Änderungen an den Repositorys und übernimmt die Transaktionsverwaltung.
Warum sollte eine Arbeitseinheit für die Transaktionsverwaltung in einer Webanwendung und nicht in einer Windows-Anwendung verwendet werden? Wenn es sich um eine N-Tier-Anwendung handelt, wird Ihre Business-Schicht tatsächlich von beiden geteilt.
Tags und Links c# transactions nhibernate data-access-layer data-access