Dan*_* T. 1 c# nhibernate session dispose transactions
我有一个NHibernate存储库,如下所示:
public class NHibRepository : IDisposable
{
public ISession Session { get; set; }
public ITransaction Transaction { get; set; }
// constructor
public NHibRepository()
{
Session = Database.OpenSession();
}
public IQueryable<T> GetAll<T>()
{
Transaction = Session.BeginTransaction();
return Session.Query<T>();
}
public void Dispose()
{
if (Transaction != null && Transaction.IsActive)
{
Transaction.Rollback(); // ObjectDisposedException on this line
}
Session.Close();
Session.Dispose();
}
~NHibRepository()
{
Dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
当我像这样使用存储库时,运行正常:
using (var repo = new NHibRepository())
{
Console.WriteLine(repo.GetAll<Product>().Count());
}
Run Code Online (Sandbox Code Playgroud)
但是当我像这样使用它时,它会抛出ObjectDisposedException:
var repo = new NHibRepository();
Console.WriteLine(repo.GetAll<Product>().Count());
Run Code Online (Sandbox Code Playgroud)
简单的解决方案是始终显式地删除存储库,但遗憾的是我无法控制使用存储库的某些类的生命周期.
我的问题是,Transaction即使我没有明确地打电话,为什么已经处理好了Dispose()?如果没有明确处理,我想让存储库自动清理它自己.
我的问题是,为什么即使我没有明确调用Dispose(),事务处理已经处理好了?
也许交易的终结者首先运行.请记住,死对象的终结器可以按任何顺序和任何线程运行,并且在最终确定之前无需正确初始化.如果您不了解终结器的所有规则,那么在尝试编写使用终结器的更多代码之前,请先了解它们.这是最难对付的事情之一.
它看起来好像你已经错误地实施了一次性模式,这将导致你一个悲伤的世界.阅读模式并正确完成; 终结者不应该处置已被处置的东西:
http://msdn.microsoft.com/en-us/magazine/cc163392.aspx
| 归档时间: |
|
| 查看次数: |
934 次 |
| 最近记录: |