Я никогда не смотрел на unhaddins, но вот что я использую для wcf, вероятно, должно работать и для многопоточных общих вещей, я думаю.
это контекст сеанса:
namespace Common.Infrastructure.WCF
{
public class NHibernateWcfSessionContext : ICurrentSessionContext
{
private readonly ISessionFactoryImplementor factory;
public NHibernateWcfSessionContext(ISessionFactoryImplementor factory)
{
this.factory = factory;
}
/// <summary>
/// Retrieve the current session for the session factory.
/// </summary>
/// <returns></returns>
public ISession CurrentSession()
{
Lazy<ISession> initializer;
var currentSessionFactoryMap = OperationContext.Current.InstanceContext.Extensions.Find<NHibernateContextManager>().SessionFactoryMaps;
if (currentSessionFactoryMap == null ||
!currentSessionFactoryMap.TryGetValue(factory, out initializer))
{
return null;
}
return initializer.Value;
}
/// <summary>
/// Bind a new sessionInitializer to the context of the sessionFactory.
/// </summary>
/// <param name="sessionInitializer"></param>
/// <param name="sessionFactory"></param>
public static void Bind(Lazy<ISession> sessionInitializer, ISessionFactory sessionFactory)
{
var map = OperationContext.Current.InstanceContext.Extensions.Find<NHibernateContextManager>().SessionFactoryMaps;;
map[sessionFactory] = sessionInitializer;
}
/// <summary>
/// Unbind the current session of the session factory.
/// </summary>
/// <param name="sessionFactory"></param>
/// <returns></returns>
public static ISession UnBind(ISessionFactory sessionFactory)
{
var map = OperationContext.Current.InstanceContext.Extensions.Find<NHibernateContextManager>().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<InstanceContext>
{
public IDictionary<ISessionFactory, Lazy<ISession>> SessionFactoryMaps = new Dictionary<ISessionFactory, Lazy<ISession>>();
public void Attach(InstanceContext owner)
{
//We have been attached to the Current operation context from the ServiceInstanceProvider
}
public void Detach(InstanceContext owner)
{
}
}
}
Edit:
, чтобы быть понятным, как говорится в другом ответе, статический контекст потока будет работать "из коробки". главное преимущество того, что у меня есть, это 1) вы получаете контроль, и 2) его ленивая реализация, поэтому вам не нужно запускать сеанс для каждого потока, если это не нужно. меньшее соединение с БД всегда лучше, имхо.