关于 Autofac 如何帮助管理 NHibernate ISession 实例(对于 ASP.NET MVC 应用程序),是否有人有任何提示或最佳实践?
最佳答案
我不太熟悉应该如何处理 NHibernate session 。也就是说,Autofac 具有出色的实例生命周期处理能力(scoping 和 deterministic disposal)。一些相关资源是this article和 this question .由于您在 ASP.Net MVC 领域,请确保您还查看 the MVC integration stuff .
为了说明这一点,这里有一个关于如何使用 Autofac 工厂委托(delegate)和 Owned
的快速示例。通用以获得对实例生命周期的完全控制:
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());
更新:我的理由是,根据 this NHibernate tutorial , session 实例的生命周期应该是“工作单元”的生命周期。因此,我们需要某种方式来控制 session 实例的创建时间和 session 的释放时间。
使用 Autofac,我们通过请求
Func<>
来获得此控制权。而不是直接输入类型。不使用 Func<>
将要求在创建 Controller 实例之前预先创建 session 实例。接下来,Autofac 中的默认设置是实例具有其容器的生命周期。由于我们知道我们需要在工作单元完成后立即处理此实例,因此我们请求
Owned
实例。在这种情况下,处置拥有的实例将立即处置基础 session 。
关于nhibernate - 使用 Autofac 管理 NHibernate ISession,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2794626/