я думаю, что вы уже упомянули решение. Вы должны использовать 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 . NHibernateHelper там во многом похож на ваш NHibernatePersistencia-Class.