Поэтому, основываясь на этом вопросе ( здесь ), о котором я спрашивал на прошлой неделе, я решил пойти и взглянуть на проект Castle и использовать средство Castle.Facilities.NHibernateIntegration.
Я провел большую часть двух дней, возясь с этим, и пришел к одной и той же проблеме: сеансы NHibernate-Safe-Safe.Я надеялся, что из коробки встроенный ISessionManager был достаточно умен для обработки потоков, и именно поэтому я решил его реализовать.
В очень редкой документации по этому конкретному проекту упоминается, что вызовISessionManager.OpenSession во многом аналогичен вызову session.GetCurrentSession.Исходя из этого, я понимаю, что у меня нет никакого способа, чтобы открыть новую отдельную сессию.
Так есть ли у меня решение для меня или какие-либо идеи, как я могу работать с этой проблемой?
(Я знаю, что большинство людей скажут, что они работают только с одним потоком, но, честно говоря, нестандартно, некоторые инструменты и процедуры автоматически порождают новый поток. Например, log4net и sessionstatestore. Вы не можете просто предполагать, что будет только одиннить, , связанная , с текущим запросом.)
Примечания:
I 'я работаю над веб-моделью с веб-приложением .NET 4.
Я вызываю и разрешаю контейнер Windsor обычным, документированным способом и позволяю контейнеру разрешить менеджер сеансов.Я делаю это в обеих темах.
Вот моя конфигурация Castle NHibernate:
Код:
<facility id="nhibernate" isWeb="true" type="Castle.Facilities.NHibernateIntegration.NHibernateFacility, Castle.Facilities.NHibernateIntegration">
<factory id="nhibernate.factory">
<settings>
<item key="connection.connection_string">#{NHibernateConnectionString}</item>
<item key="connection.driver_class">#{NHibernateDriver}</item>
<item key="connection.provider">NHibernate.Connection.DriverConnectionProvider</item>
<item key="dialect">#{NHibernateDialect}</item>
<item key="generate_statistics">true</item>
<item key="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</item>
<item key="show_sql">true</item>
</settings>
<assemblies>
<assembly>Gigastence.Base.Common</assembly>
</assemblies>
</factory>
Код:
public class NHibernateDao : INHibernateDao
{
private ISessionManager sessionManager;
public NHibernateDao(ISessionManager sessionManager)
{
this.sessionManager = sessionManager;
}
public void Append(LoggingEvent loggingEvent)
{
using (IStatelessSession session = sessionManager.OpenStatelessSession())
{
using (ITransaction tran = session.BeginTransaction())
{
Log data = new Log
{
Id = Guid.NewGuid(),
Date = loggingEvent.TimeStamp,
Level = loggingEvent.Level.ToString(),
Logger = loggingEvent.LoggerName,
Thread = loggingEvent.ThreadName,
Message = loggingEvent.MessageObject.ToString()
};
if (loggingEvent.ExceptionObject != null)
{
data.Exception = loggingEvent.ExceptionObject.ToString();
}
session.Insert(data);
tran.Commit();
}
}
}
}
- И как я называю DAO. Примечание: Это на недавно порожденной нити, которая не в моих руках.
Код:
public class NHibenateAppender : AppenderSkeleton
{
protected override void Append(LoggingEvent loggingEvent)
{
if(IoC.IsInitialized)
{
var NHibernateLogger = IoC.Resolve<INHibernateDao>();
NHibernateLogger.Append(loggingEvent);
}
}
}