2011-01-14 80 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非常相似。