在Autofac中将NHibernate ISession注册为SingleInstance

时间:2013-06-06 18:25:51

标签: c# nhibernate autofac

在很少重新启动的Windows服务中创建一个NHibernate.ISession实现的实例是否有害?我对ISession没有很好的理解,但根据我的理解,ISession实现的实例保存了对我可以在我提交更改后立即处理的事务的引用

using (ITransaction trans = MyISession.BeginTransaction())
{
 ...
trans.Commit();
}

当我在线检查代码示例时,使用autofac的实现ISession几乎总是设置为InstancePerLifetimeScope()。这实际上意味着实例将在创建它的上下文(例如HTTP请求)之后立即处理。

有人可以告诉我在长时间运行的Windows进程中将nhibernate注册为autofac中的单个实例的危害(如果有的话)吗?

builder.Register(c => new MyIsessionFactory.OpenSession()).As<ISession>().SingleInstance();

1 个答案:

答案 0 :(得分:3)

会话会跟踪已加载甚至引用的所有实体和集合。

在应用的所有生命周期内保持会话开放会导致:

  • 内存使用率极高
  • 极慢的操作(扫描加载的实体列表,这是由许多操作自动完成的,当有太多时需要很长时间)
  • 无法从错误中恢复,因为会话状态在有一个
  • 时会损坏