2011-01-14 1 views
0

У меня есть веб-сервис, который использует nhibernate. У меня есть одноэлементный шаблон в библиотеке репозитория, но при каждом вызове службы он создает новый экземпляр фабрики сеансов, который очень дорог. Что я могу сделать?nhibernate sessionfactory экземпляр более одного раза на веб-службе

#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»; –

ответ

1

Я думаю, вы уже упомянули решение. Вы должны использовать Singleton для Sessionfactory-Provider. Лично я предпочитаю использовать Spring для управления своим ApplicationContext проводными объектами, но вам это не нужно. Просто не используйте NHibernatePersistencia-Object как услугу, а как SessionProvider, и вы в порядке.

Ваш поставщик услуг может выглядеть следующим образом:

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

... и для вас SessionProvider я хотел бы предложить, чтобы всегда открывать новые сессии в запросе. Длительные сессии медленны и растут. Учитывая несколько пользователей в веб-сервисе, это не кажется хорошей идеей.

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

Это просто, но должно работать. Возможно, вы хотите взглянуть на это nhibernate.info example. NHibernateHelper очень похож на ваш NHibernatePersistencia-Class.