3

有没有办法验证 NHibernate 是否已经处理了 Session?

我在 Session 上有一个包装类,它有自己的 Finalizer 和 IDispoable 实现,但是如果 Session 在我自己在我的类中处理之前被处置,我最终会收到 ObjectDisposedException。

我真的不想用

try {
...
}
catch (ObjectDisposedException) { }

但我不确定其他任何方式。Session.IsOpen 和 Session.IsActive 属性似乎没有为我提供任何可靠的信息来确认会话已被处理。

如需完整源代码,您可以在Assembla上查看。

4

3 回答 3

1

好的,只是看看你的代码。我不知道这是否正是问题所在,但是您正在从对话处理方法调用 End(),该方法又尝试重新连接并处理会话。如果您在此之前明确调用 End(),您将得到你得到什么,避免那个电话。我认为您不应该担心在会话处理之前回滚事务,因为这是隐式完成的。只是快速浏览了一下,但我想我真的很喜欢你的实现。

于 2009-02-04T21:25:34.197 回答
0

我一直认为 NHibernate 的最佳实践是“每个请求的会话”,这意味着它应该只存在于“使用”范围内。

using(Session session = new Session())
{
}

我建议尝试阻止两个人处理会话/对话。如果您控制会话的创建,则可以将其包装在您自己的 ISession impl 中,执行它自己的 IsAlreadyDisposed() 检查以防止异常。尽管如此,考虑到努力与“预期异常”和原始代码看起来并没有那么糟糕。

我还建议注意您的终结器实施。“Session.Is().InTransaction()”进入 Session->Transaction 并且在终结者轮到它时会话可能为空。不能保证在终结时导航托管关系。

于 2009-02-03T22:18:19.973 回答
0

“这是我见过的最荒谬的事情之一,它的 Open 属性即使在处置后仍然保持真实”

为什么您已经处置的对象会包含有关其状态的可靠信息?您不应该尝试使用已处置的会话,我也不知道 nhibernate 在哪里处置您的会话,您确定不是自己处置吗?

于 2009-02-04T20:33:02.680 回答