Pourquoi devrais-je utiliser l'unité de modèle de travail au-dessus d'une session NHibernate?

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

  •  13-09-2019
  •  | 
  •  

Question

Quand dois-je écrire une implémentation UOW au-dessus de ce qui est déjà fourni par NHibernate? Tous les exemples du monde réel?

Était-ce utile?

La solution

L'unité de travail que vous décrivez est déjà fourni par NHibernate donc il n'y a aucune raison de faire une telle unité de travail.

Ce que nous avons dans notre service WCF est une unité de niveau supérieur de travail qui contient des informations importantes dans notre demande de l'unité de travail actuel. Cela inclut l'abstraire NHibernate ISession pour nous. Lorsque vous décomposez vous avez du code qui entre dans trois catégories

  1. Le code qui doit faire face à une unité de travail. Peu importe qui soutient l'unité de travail. Il pourrait être NHibernate, iBatis ou un ORM personnalisé. Tout le code doit faire est de charger, Rollback, Save, etc. Il ne ne devrait pas se soucier du mécanisme utilisé pour le faire.

  2. Le code qui doit faire face à un ISession directement parce qu'il fait NHibernate des choses spécifiques. Habituellement, cela a à voir avec des requêtes complexes qui doivent être créés.

  3. n'a pas besoin de savoir qu'il est en cours d'exécution dans une unité de travail ou accéder au ISession. Nous pouvons ignorer complètement ce dans le cadre de cette discussion.

Alors que le code à 1. pourrait juste travailler contre une ISession notre préférence est d'essayer de choses abstraites loin dans le code que nous ne contrôlons pas directement ou cela pourrait changer. Cette valeur a pour deux raisons.

  • Quand nous avons commencé, nous étions pas à 100% vendus sur NHibernate. Nous envisagions iBatis ou la coutume quelque chose. Il est évident que ce ne soit plus un problème.

  • ne sont pas des experts en NHibernate nous ne voulons pas les Toute l'équipe d'être. Pour la plupart des gens partie d'écrire du code qui correspond dans la catégorie 1. et tout ce qu'ils connaissent est notre unité de travail. Lorsque le code dans la catégorie 2. doit s'écrite sera écrite par le peuple sur l'équipe qui comprennent bien NHibernate.

Donc, pour conclure, je dirais que le type d'unité de travail dont vous parlez n'est pas nécessaire, je suggère qu'une unité de niveau supérieur de travail peut fournir beaucoup de valeur.

Autres conseils

Mon unité de base de l'interface de travail contient les méthodes suivantes - Initialiser - Engagez - Retour en arriere - IDisposable.Dispose

Je l'utilise à la fois la session et la gestion des transactions. Il est utile parce que je ne dois pas écrire ce code encore et encore pour les étendues de session différentes. (Unité de travail par demande, par série de demandes, par fil, etc.)

Pourvu que vous configurez toutes vos applications correctement (à savoir cascades), vous ne devez pas faire quelque chose de spécial et ISession fera très bien. Toutefois, si vous écrivez une application 3 niveaux, vous devrez vous souhaitez effectuer en une seule transaction les opérations de base de données séquence manuellement. « La mise en œuvre de référence » de Fowler dans « Modèles d'architecture Enterprise Application » peut être un bon point de départ:

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());
   }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top