在multithreadingWindows服务应用程序中使用的最佳NHibernate会话管理方法是什么?

我有一个使用multithreading的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的东西,应该也可以用于我想象的multithreading一般的东西。

这是会话上下文:

 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) { } } } 

编辑:

要清楚,正如另一个答案所述,线程静态上下文将开箱即用。 我在这里拥有的主要优点是1)你可以控制,2)它是一个懒惰的实现,所以如果没有必要,你不必为每个线程启动一个会话。 imho,与db的连接总是更好。