Ну, есть несколько способов доступа к ISessionFactory в приложении statefull (и настольное приложение - это приложение такого типа), среди них:
Singleton
Вы можете создать фабрику сессий один раз во время запуска вашей программы и получить к ней доступ через статический одноэлементный класс.
Это заставит приложение использовать только один экземпляр фабрики сеансов.
пример:
public sealed class NHibernateHelper
{
private static ISessionFactory SessionFactory;
private static readonly Configuration NhibernateConfig;
// ....
static NHibernateHelper()
{
NhibernateConfig = new Configuration().Configure();
SessionFactory = NhibernateConfig.BuildSessionFactory();
}
public static ISessionFactory GetSessionFactory()
{
return SessionFactory;
}
// ....
}
... и доступ к фабрике сеансов через метод GetSessionFactory во всем приложении.
Контекстный объект и / или внедрение зависимостей
Вы можете построить фабрику сеансов из конфигурации и передать ее через объект контекста по всему приложению.
пример:
при запуске:
// here you configure NHibernate.
ISessionFactory _sessionFactory = BuildMySessionFactory();
// ...
ObjectFactory.Initialize(x =>
{
x.For<IPatientRepository>()
.Use<StandardPatientRepository>()
.Ctor<ISessionFactory>().Is(_sessionFactory);
// ... initialize the rest of your repositories...
});
, то:
public class StandardPatientRepository : IPatientRepository
{
private readonly ISessionFactory _sessionFactory;
public StandardPatientRepository(ISessionFactory sessionFactory)
{
if (sessionFactory == null)
throw new ArgumentNullException("sessionFactory");
_sessionFactory = sessionFactory;
}
public virtual Patient Get(Guid id)
{
using (IStatelessSession session =
_sessionFactory.OpenStatelessSession())
{
return session.Get<Patient>(id);
}
}
// the rest of data-access methods.
}
тогда в ваших классах, которые будут использовать данные (т.е. использовать репозитории), вы будете использовать:
Patient = ObjectFactory.GetInstance<IPatientRepository>().Get(patient);
По моему мнению, второй метод лучше, так как я думаю, что синглтон в большинстве случаев является анти-паттерном. Второй подход даст вам больше контроля над уровнем данных, вы будете знать, кто и когда обращается к нему.