Я все еще довольно новичок в этих технологиях.Настоящая проблема здесь заключается в том, как управлять сеансами для потока в консольном приложении.В настоящее время, если я запускаю его как единый поток, все хорошо.Как только я переключусь на многопоточную модель, я начну видеть конфликт на уровне сеанса (поскольку объект Session не является безопасным по своей конструкции). Исключения KeyNotFound (среди прочих) начинают генерироваться.
В веб-приложении вы должны сделать что-то вроде этого:
/// <summary>
/// Due to issues on IIS7, the NHibernate initialization cannot reside in Init() but
/// must only be called once. Consequently, we invoke a thread-safe singleton class to
/// ensure it's only initialized once.
/// </summary>
protected void Application_BeginRequest(object sender, EventArgs e)
{
NHibernateInitializer.Instance().InitializeNHibernateOnce(
() => InitializeNHibernateSession());
}
/// <summary>
/// If you need to communicate to multiple databases, you'd add a line to this method to
/// initialize the other database as well.
/// </summary>
private void InitializeNHibernateSession()
{
var path = ConfigurationManager.AppSettings["NHibernateConfig"];
NHibernateSession.Init(
webSessionStorage,
new string[] { Server.MapPath("~/bin/foo.Data.dll") },
new AutoPersistenceModelGenerator().Generate(),
Server.MapPath("~/App_Configuration/" + path ));
}
// sample of my console app... very simple
static void Main(string[] args)
{
InitializeNHibernateSession();
while(true)
{
Task.Factory.StartNew(() => SomeAwesomeLongRunningPieceOfWork());
}
}
, который по существу выполняет инициализацию один раз для потока (веб-запроса) в global.asax.
Любые идеи о том, как настроить это (управление сеансом) в консольном приложении?