nhibernate - 使用 Autofac 管理 NHibernate ISession

标签 nhibernate autofac

关于 Autofac 如何帮助管理 NHibernate ISession 实例(对于 ASP.NET MVC 应用程序),是否有人有任何提示或最佳实践?

最佳答案

我不太熟悉应该如何处理 NHibernate session 。也就是说,Autofac 具有出色的实例生命周期处理能力(scopingdeterministic disposal)。一些相关资源是this articlethis 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/

相关文章:

NHibernate - 向类添加新属性

c# - 一段时间后在 RabbitMQ 中获取 OutOfMemory

nhibernate - 设置上次修改时间和使用 NHibernate 修改的人员的最佳做法是什么?

c# - 避免使用 NHibernate 实体列表进行 N+1 选择

c# - 如何使用运行时参数轻松管理适配器和/或装饰器?

c# - 解决Command Handler对caSTLe windsor的依赖

c# - 如何向 AutoFac 注册需要参数的泛型类?

c# - 消除工厂中的 IoC 容器耦合

c# - 如何在 NHibernate 中创建表示两个 EXISTS 之间的 OR 的条件?

具有许多参数的 C# 数据访问 GetAll() 方法