Warum sollte ich verwenden, um die Einheit des Arbeits Muster auf der Oberseite einer NHibernate-Sitzung?

StackOverflow https://stackoverflow.com/questions/980584

  •  13-09-2019
  •  | 
  •  

Frage

Wann würde ich eine UOW Implementierung auf der Oberseite schreiben, was bereits von NHibernate zur Verfügung gestellt? Irgendwelche realen Welt Beispiele?

War es hilfreich?

Lösung

Die Arbeitseinheit Sie beschreiben bereits von NHibernate vorgesehen ist, so gibt es keinen Grund, eine solche Einheit der Arbeit zu tun.

Was wir in unserem WCF-Dienst haben, ist eine höhere Arbeitseinheit, die für die aktuelle Arbeitseinheit Informationen wichtig in unserer Anwendung enthält. Dazu gehören Abstrahieren der NHibernate ISession für uns. Wenn Sie es brechen haben Sie Code, der in drei Kategorien passt

  1. Code, der mit einer Arbeitseinheit behandeln muss. Es spielt keine Rolle, die die Einheit der Arbeit sichert. Es könnte NHibernate, iBatis oder eine benutzerdefinierte ORM sein. Alle Lasten, Rollback, Speicher zu tun, muss der Code ist, etc. Es ihm so zu tun, um den Mechanismus Pflege verwendet wird, nicht noch sollte.

  2. Code, der mit einem ISession umgehen muss direkt, weil es NHibernate bestimmte Dinge tut. Normalerweise hat dies mit komplexen Abfragen zu tun, die erstellt werden müssen.

  3. muss nicht wissen, dass es die Arbeit in einer Einheit ausgeführt wird oder die ISession zugreifen. Wir können dies völlig ignorieren als Teil dieser Diskussion.

Während Code in 1 nur gegen einen ISession arbeiten könnte unsere Präferenz ist zu abstrahieren Dingen im Code, um zu versuchen, die wir nicht kontrollieren direkt oder das ändern könnte. Dieser Wert hat aus zwei Gründen.

  • Als wir begannen wir auf NHibernate nicht zu 100% verkauft wurden. Wir waren in Anbetracht iBatis oder etwas Brauch. Offensichtlich ist dies kein Thema mehr.

  • Das gesamte Team sind keine Experten in NHibernate noch wir wollen, dass sie zu sein. Für den größten Teil Menschen Code schreiben, der in die Kategorie passt 1. und alles, was sie wissen ist unsere Arbeitseinheit. Wenn Code in Kategorie 2 hat geschrieben, um es von den Leuten im Team geschrieben wird, die NHibernate gut verstehen.

So schließen würde ich sagen, dass die Art der Arbeitseinheit Sie sprechen nicht benötigt wird, würde ich vorschlagen, dass eine höhere Ebene der Arbeitseinheit sehr viel Wert liefern kann.

Andere Tipps

Meine grundlegende Arbeitseinheit-Schnittstelle enthält die folgenden Methoden - Initialisieren - Verpflichten - Rollback - IDisposable.Dispose

Ich benutze es für beide Sitzung und Transaktionsmanagement. Es ist sinnvoll, weil ich nicht, dass Code immer wieder für unterschiedliche Sitzungs Bereiche zu schreiben. (Arbeitseinheit pro Anfrage, pro Reihe von Anfragen, pro Faden, etc.)

Sofern Sie alle Daten korrekt Ihre Zuordnungen einrichten (das heißt Kaskaden), müssen Sie nichts weiter tun und ISession tut einfach gut. Wenn Sie jedoch sind eine 3-Tier-Anwendung zu schreiben, haben Sie manuell Sequenzdatenbankoperationen, die Sie in einer einzigen Transaktion durchgeführt werden soll. Fowler "Referenz-Implementierung" in "Patterns of Enterprise Application Architecture" kann ein guter Ausgangspunkt sein:

class UnitOfWork... 

   public void registerNew(DomainObject obj) {
      Assert.notNull("id not null", obj.getId());
      Assert.isTrue("object not dirty", !dirtyObjects.contains(obj));
      Assert.isTrue("object not removed", !removedObjects.contains(obj));
      Assert.isTrue("object not already registered new", !newObjects.contains(obj));
      newObjects.add(obj);
   }
   public void registerDirty(DomainObject obj) {
      Assert.notNull("id not null", obj.getId());
      Assert.isTrue("object not removed", !removedObjects.contains(obj));
      if (!dirtyObjects.contains(obj) && !newObjects.contains(obj)) {
         dirtyObjects.add(obj);
      }
   }
   public void registerRemoved(DomainObject obj) {
      Assert.notNull("id not null", obj.getId());
      if (newObjects.remove(obj)) return;
      dirtyObjects.remove(obj);
      if (!removedObjects.contains(obj)) {
         removedObjects.add(obj);
      }
   }
   public void registerClean(DomainObject obj) {
      Assert.notNull("id not null", obj.getId());
   }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top