2010-02-28 4 views
0

J'ai une application asp.net avec l'installation Nihbernate, maintenant je veux le convertir en application de formulaire Windows.Nhibernate avec Windows formulaire

Voici les codes qui ont été configurés dans le fichier Global.asax.cs. Quelqu'un peut-il me donner un exemple de code comment faire cela sous Windows?

protected void Application_BeginRequest(object sender, EventArgs e) 
    { 
     ManagedWebSessionContext.Bind(HttpContext.Current, SessionManager.SessionFactory.OpenSession()); 
    } 

    protected void Application_EndRequest(object sender, EventArgs e) 
    { 
     ISession session = ManagedWebSessionContext.Unbind(HttpContext.Current, SessionManager.SessionFactory); 
     if (session != null) 
     { 
      try 
      { 
       if (session.Transaction != null && session.Transaction.IsActive) 
       { 
        session.Transaction.Rollback(); 
       } 
       else 
       { 
        session.Flush(); 
       } 
      } 
      finally 
      { 

       session.Close(); 
      } 
     } 
    } 

Répondre

1

Eh bien, il existe plusieurs méthodes d'accès ISessionFactory en application de statefull (et une application de bureau est ce genre d'application), parmi lesquels:

Singleton Vous pouvez construire une fois l'usine de la session au cours le démarrage de votre programme et l'accès à travers une classe de singleton statique. Cela forcerait l'application à n'utiliser qu'une seule instance de la fabrique de sessions.

exemple:

public sealed class NHibernateHelper 
{ 
    private static ISessionFactory SessionFactory; 
    private static readonly Configuration NhibernateConfig; 
    // .... 
    static NHibernateHelper() 
    { 
     NhibernateConfig = new Configuration().Configure(); 
     SessionFactory = NhibernateConfig.BuildSessionFactory(); 
    } 

    public static ISessionFactory GetSessionFactory() 
    { 
     return SessionFactory; 
    } 
    // .... 
} 

... et accéder à l'usine de la session par la méthode GetSessionFactory dans toute l'application.

Contexte objet et/ou injection de dépendances

Vous pouvez construire l'usine de la session de configuration et passer à travers un objet de contexte dans toute l'application.

exemple:

  1. lors du démarrage:

    // here you configure NHibernate. 
    ISessionFactory _sessionFactory = BuildMySessionFactory(); 
    // ... 
    ObjectFactory.Initialize(x => 
    { 
           x.For<IPatientRepository>() 
           .Use<StandardPatientRepository>() 
           .Ctor<ISessionFactory>().Is(_sessionFactory); 
    
    // ... initialize the rest of your repositories... 
    }); 
    
  2. alors:

    public class StandardPatientRepository : IPatientRepository 
    { 
        private readonly ISessionFactory _sessionFactory; 
        public StandardPatientRepository(ISessionFactory sessionFactory) 
        { 
         if (sessionFactory == null) 
          throw new ArgumentNullException("sessionFactory"); 
    
         _sessionFactory = sessionFactory; 
        } 
        public virtual Patient Get(Guid id) 
        { 
         using (IStatelessSession session = 
            _sessionFactory.OpenStatelessSession()) 
         { 
          return session.Get<Patient>(id); 
         } 
        } 
        // the rest of data-access methods. 
    } 
    

alors dans vos classes qui utiliseront des données (p. utiliser les dépôts) vous utiliserez:À mon avis, la deuxième méthode est préférable car je pense que dans la plupart des cas, un singleton est un anti-pattern. La seconde approche vous donnera plus de contrôle sur votre couche de données, vous saurez qui et quand y accéder.

+0

Salut Karim merci. Pourriez-vous m'envoyer une petite application de bureau en tant qu'échantillon? –

+0

quel est votre e-mail? –

1

Voici une bien fait et une vaste exemple d'application utilisant NHibernate dans une application de bureau:

Building a Desktop To-Do Application with NHibernate

Gestion de la session NHibernate dans une application de bureau tend à être beaucoup plus impliqués que la gestion de la session NHibernate dans une application web.