Ответ 1
Я не слишком разбираюсь в том, как следует обрабатывать сеансы NHibernate. Тем не менее, Autofac имеет отличную обработку жизненного цикла экземпляров (scoping и детерминированное удаление). Некоторые связанные ресурсы эта статья и этот вопрос. Поскольку вы находитесь в среде ASP.Net MVC, убедитесь, что вы также смотрите в материал для интеграции MVC.
Чтобы проиллюстрировать эту точку, здесь приведено краткое описание того, как вы можете использовать делегаты Autofac factory и Owned
generic, чтобы получить полный контроль над временем жизни экземпляра:
public class SomeController
{
private readonly Func<Owned<ISession>> _sessionFactory;
public SomeController(Func<Owned<ISession>> sessionFactory)
{
_sessionFactory = sessionFactory;
}
public void DoSomeWork()
{
using (var session = _sessionFactory())
{
var transaction = session.Value.BeginTransaction();
....
}
}
}
Настройка контейнера, чтобы заставить это работать, довольно проста. Обратите внимание, что нам не нужно ничего делать, чтобы получить типы Func<>
и Owned<>
, они автоматически становятся доступны Autofac:
builder.Register(c => cfg.BuildSessionFactory())
.As<ISessionFactory>()
.SingleInstance();
builder.Register(c => c.Resolve<ISessionFactory>().OpenSession());
Обновление:. Мое рассуждение заключается в том, что согласно этот учебник NHibernate, время жизни экземпляра сеанса должен быть "единицы работы". Таким образом, нам нужен какой-то способ управления как при создании экземпляра сеанса, так и при размещении сеанса.
С Autofac мы получим этот элемент управления, запросив вместо Func<>
вместо типа. Не используя Func<>
, требуется, чтобы экземпляр сеанса был создан заранее до создания экземпляра контроллера.
Далее, по умолчанию в Autofac указано, что экземпляры имеют срок службы своего контейнера. Поскольку мы знаем, что нам нужна возможность утилизировать этот экземпляр, как только будет завершена часть работы, мы запрашиваем экземпляр Owned
. Утилизация принадлежащего экземпляру в этом случае немедленно удалит основной сеанс.