2010-12-11 82 views
1

Nous souhaitons tirer parti de la fonctionnalité "Unité de travail" de nHibernate. Pour ce faire, dans notre application C# WinForms, nous devons ouvrir une session à partir de la couche d'interface utilisateur i.e lorsqu'un formulaire s'ouvre. Effectuez du travail, puis fermez la session lorsque nous fermons le formulaire.nHibernate -> Dépendance dans la couche d'interface utilisateur

Cette forme approche basée semble très logique à l'exception du fait que nous avons besoin maintenant une référence à NHibernate de notre couche d'interface utilisateur! Où devrions-nous référencer nHibernate, j'aurais pensé que nous pourrions accomplir ceci sans avoir à le référencer à partir de notre couche d'interface utilisateur?

+0

Pourquoi cela n'est-il pas logique? La limite de l'unité de travail est déterminée par l'interface utilisateur, donc pour moi, cela semble très logique. – Paco

+0

Paco, il est logique d'avoir l'interface utilisateur comme limite pour UoW, mais avoir une référence à une bibliothèque de persistance concrète dans la couche d'interface utilisateur est une puanteur de code. L'interface utilisateur ne devrait rien savoir sur une implémentation spécifique, elle ne devrait porter que sur le concept d'UoW. Ryudice a essentiellement répondu à la question de Josata. –

+1

Si vous créez un wrapper autour de celui-ci, l'interface utilisateur connaît également l'implémentation, elle connaît le contour de l'encapsuleur et pour éviter cela, vous avez besoin d'un wrapper autour d'un wrapper, etc. – Paco

Répondre

2

Vous avez besoin d'une classe de gestionnaire de session, ce qui serait une enveloppe pour la liaison de la session NHibernate. Quelque chose comme ceci:

public class SessionManager : ISessionManager 
{ 
    private readonly ISessionFactory _sessionFactory; 

    SessionManager() 
    { 
     _sessionFactory = CreateSessionFactory(); 
    } 

    public void OpenSession() 
    { 
     ISession session = _sessionFactory.OpenSession(); 

     session.BeginTransaction(); 

     CurrentSessionContext.Bind(session); 
    } 


    public void CloseSession() 
    { 
     ISession session = CurrentSessionContext.Unbind(_sessionFactory); 


     if (session == null) return; 


     try 
     { 
      session.Transaction.Commit(); 
     } 

     catch (Exception) 
     { 
      session.Transaction.Rollback(); 
     } 

     finally 
     { 
      session.Close(); 

      session.Dispose(); 
     } 
    } 
} 

Il suffit de créer la méthode CreateSessionFactory.

+0

.. et ISessionManager vivrait à côté des référentiels abstraits (IRepository) tandis que SessionManager vivrait avec l'implémentation du référentiel NHibernate. Pas dans la couche d'interface utilisateur (ou projet). –