Nhibernate: Wer ist verantwortlich für das Transaktionsmanagement in einer nicht webbasierten Anwendung?

8

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?

    
Rookian 26.07.2011, 19:56
quelle

2 Antworten

4

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:

%Vor%

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:

  1. Beginnen Sie einen verschachtelten IoC-Bereich (den Bereich "Arbeitseinheit")
  2. Starten Sie eine ISession und eine Transaktion (dies ist wahrscheinlich als Teil von Schritt 3 impliziert)
  3. Beheben Sie IHandle<ChangeNameCommand> aus dem IoC-Bereich
  4. Übergeben Sie den Befehl an den Handler (die Domäne arbeitet)
  5. Übernehmen Sie die Transaktion
  6. Beende den IoC-Bereich (die Arbeitseinheit)

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.

    
default.kramer 28.07.2011, 22:55
quelle
1

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.

    
Joel C 26.07.2011 20:21
quelle