UPDATE
Я принял свой ответ, так как считаю, что модуль OnePerRequest не должен очищать кеш, пока все другие модули не смогут запустить. Однако после того, как мы перенесем остальные наши страницы в MVC, я переделываю нашу реализацию Unit of Work, чтобы она больше соответствовала предложению Remo.
Я только что обновил Ninject 2.0 до Ninject 2.1, и теперь у меня возникают проблемы с моей реализацией NHibernate UnitOfWork.
Моя реализация заключается в следующем. У меня есть HttpModule, который подписывается на BeginRequest и EndRequest и имеет следующий код.
public void BeginRequest(object sender, EventArgs e)
{
var app = (WebApplication)sender;
var repository = app.Kernel.Get<IRepository>();
repository.BeginRequest();
}
public void EndRequest(object sender, EventArgs e)
{
var app = (WebApplication)sender;
var repository = app.Kernel.Get<IRepository>();
repository.EndRequest();
}
Реализация IRepository принимает NHibernate ISession в качестве зависимости. Вот две привязки.
Bind<ISession>().ToMethod(context => NHibernateSessionFactory.Instance.OpenSession()).InRequestScope();
Bind<IRepository>().To<NHibernateRepository>().InTransientScope();
Репозиторий NHibernate открывает транзакцию в BeginRequest и фиксирует ее в EndRequest. С обновлением до Ninject 2.1. OnePerRequestModule теперь мешает этому коду. Поскольку он сначала присоединяется к событию EndRequest, он запускается раньше, чем мой DataModule, и очищает ISession из кэша ядра. Это означает, что IRepository получает новую ISession и, следовательно, не может совершить транзакцию. Сложным является тот факт, что OnePerRequestModule регистрируется в Ядре не один, а два раза. Один раз в конструкторе KernelBase и еще раз в методе Application_Start в приложении NinjectHttpApplication.
Так что это довольно запутанно, и я нашел один из способов отключить эту функцию - позвонить OnePerRequestModule.StopManaging(Kernel);
дважды в методе OnApplicationStarted в моем Global.asax.cs. У кого-нибудь есть какие-либо предложения относительно того, как справиться с этим? Я предполагаю, что есть причина, по которой был представлен OnePerRequestModule, но было бы неплохо придерживаться моей реализации UnitOfWork.