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
Je semble être en mesure d'utiliser PerWebRequest avec Castle jusqu'à présent. – cs0815
Pouvez-vous utiliser simplement Castle pour tout configurer pour l'option 2? – cs0815