Каков наилучший подход к управлению сеансом NHibernate для использования в многопоточном приложении для работы с Windows?

У меня есть приложение для Windows, которое работает с многопоточным. Я использую NHibernate на уровне доступа к данным этого приложения.

Каково ваше предложение по управлению сеансом в этом приложении. Я читал о UNHAddins, это хорошее решение?

Я использую встроенные контекстные сеансы NHibernate. Вы можете прочитать о них здесь:

http://nhibernate.info/doc/nhibernate-reference/architecture.html#architecture-current-session

Вот пример того, как я использую это:

public class SessionFactory { protected static ISessionFactory sessionFactory; private static ILog log = LogManager.GetLogger(typeof(SessionFactory)); //Several functions omitted for brevity public static ISession GetCurrentSession() { if(!CurrentSessionContext.HasBind(GetSessionFactory())) CurrentSessionContext.Bind(GetSessionFactory().OpenSession()); return GetSessionFactory().GetCurrentSession(); } public static void DisposeCurrentSession() { ISession currentSession = CurrentSessionContext.Unbind(GetSessionFactory()); currentSession.Close(); currentSession.Dispose(); } } 

В дополнение к этому в моем конфигурационном файле hibernate есть следующее:

 thread_static 

я никогда не смотрел на unhaddins, но вот что я использую для wcf, вероятно, должен работать для многопоточных общих вещей, которые я тоже себе представляю.

это контекст сеанса:

 namespace Common.Infrastructure.WCF { public class NHibernateWcfSessionContext : ICurrentSessionContext { private readonly ISessionFactoryImplementor factory; public NHibernateWcfSessionContext(ISessionFactoryImplementor factory) { this.factory = factory; } ///  /// Retrieve the current session for the session factory. ///  ///  public ISession CurrentSession() { Lazy initializer; var currentSessionFactoryMap = OperationContext.Current.InstanceContext.Extensions.Find().SessionFactoryMaps; if (currentSessionFactoryMap == null || !currentSessionFactoryMap.TryGetValue(factory, out initializer)) { return null; } return initializer.Value; } ///  /// Bind a new sessionInitializer to the context of the sessionFactory. ///  ///  ///  public static void Bind(Lazy sessionInitializer, ISessionFactory sessionFactory) { var map = OperationContext.Current.InstanceContext.Extensions.Find().SessionFactoryMaps;; map[sessionFactory] = sessionInitializer; } ///  /// Unbind the current session of the session factory. ///  ///  ///  public static ISession UnBind(ISessionFactory sessionFactory) { var map = OperationContext.Current.InstanceContext.Extensions.Find().SessionFactoryMaps; var sessionInitializer = map[sessionFactory]; map[sessionFactory] = null; if (sessionInitializer == null || !sessionInitializer.IsValueCreated) return null; return sessionInitializer.Value; } } } 

это менеджер контекста:

 namespace Common.Infrastructure.WCF { class NHibernateContextManager : IExtension { public IDictionary> SessionFactoryMaps = new Dictionary>(); public void Attach(InstanceContext owner) { //We have been attached to the Current operation context from the ServiceInstanceProvider } public void Detach(InstanceContext owner) { } } } 

Редактировать:

чтобы быть ясным, как утверждает другой ответ, статический контекст streamа будет работать из коробки. главное преимущество того, что у меня здесь: 1) вы получаете контроль, и 2) его ленивая реализация, поэтому вам не нужно начинать сеанс для каждого streamа, если это не нужно. меньше соединение с db всегда лучше, imho.