2010-03-04 4 views
0

J'ai implémenté un service qui utilise un DAOFactory et un assistant NHibernate pour les sessions et les transactions. Le code suivant est très simplifié:question architecturale asp.net mvc, nhibernate, castle

public interface IService 
{ 
    IList<Disease> getDiseases(); 
} 

public class Service : IService 
{ 
    private INHibernateHelper NHibernateHelper; 
    private IDAOFactory DAOFactory; 

    public Service(INHibernateHelper NHibernateHelper, IDAOFactory DAOFactory) 
    { 
     this.NHibernateHelper = NHibernateHelper; 
     this.DAOFactory = DAOFactory; 
    } 

    public IList<Disease> getDiseases() 
    { 
     return DAOFactory.getDiseaseDAO().FindAll(); 
    } 
} 

public class NHibernateHelper : INHibernateHelper 
{ 
    private static ISessionFactory sessionFactory; 

    /// <summary> 
    /// SessionFactory is static because it is expensive to create and is therefore at application scope. 
    /// The property exists to provide 'instantiate on first use' behaviour. 
    /// </summary> 
    private static ISessionFactory SessionFactory 
    { 
     get 
     { 
      if (sessionFactory == null) 
      { 
       try 
       { 
        sessionFactory = new Configuration().Configure().AddAssembly("Bla").BuildSessionFactory(); 
       } 
       catch (Exception e) 
       { 
        throw new Exception("NHibernate initialization failed.", e); 
       } 
      } 
      return sessionFactory; 
     } 
    } 

    public static ISession GetCurrentSession() 
    { 
     if (!CurrentSessionContext.HasBind(SessionFactory)) 
     { 
      CurrentSessionContext.Bind(SessionFactory.OpenSession()); 
     } 
     return SessionFactory.GetCurrentSession(); 
    } 

    public static void DisposeSession() 
    { 
     var session = GetCurrentSession(); 
     session.Close(); 
     session.Dispose(); 
    } 

    public static void BeginTransaction() 
    { 
     GetCurrentSession().BeginTransaction(); 
    } 

    public static void CommitTransaction() 
    { 
     var session = GetCurrentSession(); 
     if (session.Transaction.IsActive) 
      session.Transaction.Commit(); 
    } 

    public static void RollbackTransaction() 
    { 
     var session = GetCurrentSession(); 
     if (session.Transaction.IsActive) 
      session.Transaction.Rollback(); 
    } 
} 

A la fin de la journée, je veux juste exposer le IService à ASP.NET MVC/application Console/Winform. Je peux déjà utiliser le service dans une application console, mais je voudrais l'améliorer en premier. Je suppose que la première amélioration serait d'injecter les interfaces INHibernateHelper et IDAOFactory via castle. Mais je pense que le problème est que NHibernateHelper peut causer des problèmes dans un contexte asp.net où NHibernateHelper devrait fonctionner selon le modèle 'Nhibernate session per request'. Une question que je me pose est de savoir si ce modèle est déterminé par la section nhibernate config (setting current_session_context_class = web) ou est-ce que je peux le contrôler via un château en quelque sorte?

J'espère que cela a du sens. Le but final est juste d'exposer THE IService.

Merci.

Christian

Répondre

0

Vous avez deux choix ..

1) Hôte dans WCF. Cela vous permet d'accéder à partir de n'importe quelle source que vous voulez.

2) Faire abstraction de tout ce qui est spécifique à l'utilisation du code. Dans notre système, par exemple, nous utilisons notre propre implémentation Unit Of Work qui est stockée différemment en fonction de l'endroit où le code est exécuté. Un petit exemple consisterait à stocker quelque chose en utilisant le contexte d'appel WCF par rapport au thread actuel.

+0

Je semble être en mesure d'utiliser PerWebRequest avec Castle jusqu'à présent. – cs0815

+0

Pouvez-vous utiliser simplement Castle pour tout configurer pour l'option 2? – cs0815