2011-01-14 81 views
0

我有一个使用nhibernate的web服务。我在存储库上有一个单例模式,但是在每次调用服务时,它会创建一个非常昂贵的会话工厂的新实例。我能做什么?nhibernate sessionfactory实例不止一次在web服务上

#region Atributos 

    /// <summary> 
    /// Session 
    /// </summary> 
    private ISession miSession; 

    /// <summary> 
    /// Session Factory 
    /// </summary> 
    private ISessionFactory miSessionFactory; 
    private Configuration miConfiguration = new Configuration(); 
    private static readonly ILog log = LogManager.GetLogger(typeof(NHibernatePersistencia).Name); 

    private static IRepositorio Repositorio; 

    #endregion 

    #region Constructor 

    private NHibernatePersistencia() 
    { 
     //miConfiguration.Configure("hibernate.cfg.xml"); 
     try 
     { 
      miConfiguration.Configure(); 
      this.miSessionFactory = miConfiguration.BuildSessionFactory(); 
      this.miSession = this.SessionFactory.OpenSession(); 
      log.Debug("Se carga NHibernate"); 

     } 
     catch (Exception ex) 
     { 
      log.Error("No se pudo cargar Nhibernate " + ex.Message); 
      throw ex; 
     } 

    } 

    public static IRepositorio Instancia 
    { 
     get 
     { 
      if (Repositorio == null) 
      { 
       Repositorio = new NHibernatePersistencia(); 
      } 
      return Repositorio; 
     } 
    } 

    #endregion 

    #region Propiedades 

    /// <summary> 
    /// Sesion de NHibernate 
    /// </summary> 
    public ISession Session 
    { 
     get { return miSession.SessionFactory.GetCurrentSession(); } 
    } 

    /// <summary> 
    /// Sesion de NHibernate 
    /// </summary> 
    public ISessionFactory SessionFactory 
    { 
     get { return this.miSessionFactory; } 
    } 

    #endregion 

以哪种方式可以为所有服务创建单个实例?

+0

建议:不要使用“throw ex;”。你想“扔”。否则,堆栈跟踪将看起来像是来自“throw ex”位置的异常。 – 2011-01-19 00:39:05

回答

1

我想你已经提到了解决方案。你必须为Sessionfactory-Provider使用一个Singleton。就我个人而言,我更喜欢使用Spring来管理我的ApplicationContext来连接我的对象,但是您不必这样做。简单地不要使用NHibernatePersistencia-Object作为服务,而是使用SessionProvider,你很好。

你的服务看起来是这样的:

public class YourService : IYourService 
{ 
    public User GetUsers(int id) 
    { 
     using(NHibernatePersistencia.OpenSession()) 
     { 
      return session.Load(typeof(user), id); 
     } 
    }  
} 

...和你SessionProvider我建议要始终打开每个请求新的会话。长期会议缓慢且不断增长。考虑到web服务中的多个用户,这似乎不是一个好主意。

public class NHibernatePersistencia 
{ 
    /* ... */ 
    public ISession OpenSession() 
    { 
     return this.SessionFactory.OpenSession(); 
    } 
    /* ... */ 
} 

这很简单,但应该工作。也许你想看看这个nhibernate.info example。 NHibernateHelper与你的NHibernatePersistencia-Class非常相似。