无论如何要验证会话是否已被NHibernate处理掉?
我在Session上有一个包装器类,它有自己的Finalizer和IDispoable实现,但是如果Session在我自己处理它之前被处理掉了,我最终会收到一个ObjectDisposedException。
我真的不希望用
包装我的清理代码try {
...
}
catch (ObjectDisposedException) { }
但我不确定其他任何方式。 Session.IsOpen和Session.IsActive属性似乎没有提供任何可靠的信息,以便我确认会话已被处理。
对于完整来源,您可以在Assembla上查看。
答案 0 :(得分:1)
好的,只是偷看你的代码。 我不知道这是不是问题,但你是从对话配置方法调用End(), 反过来又试图重新连接和处理会话.. 如果你在此之前已经明确地调用了End(),那么你将得到你得到的,避免那个调用。 我认为您不应该担心在会话处置之前回滚事务,因为这是隐式完成的。 刚看了一眼,但我想我真的很喜欢你的实现。
答案 1 :(得分:0)
我一直认为NHibernate的最佳实践是“每个请求的会话”,这意味着它应该只存在于“使用”范围内。
using(Session session = new Session())
{
}
我建议尝试阻止两个人处理会话/会话。如果您控制会话的创建,您可以将它包装在您自己的ISession impl中,该impl执行它自己的IsAlreadyDisposed()检查以防止异常。考虑到这种努力与“预期异常”和原始代码看起来并不那么糟糕。
我还建议你注意你的终结者实施。 “Session.Is()。InTransaction()”进入Session->事务,并且当终结者到达它时,会话可能为空。在终结者时间导航托管关系并不能保证有效。
答案 2 :(得分:0)
“这是我见过的最荒谬的事情之一,即使在处置后,其开放资产仍然属实”
为什么您已经处置的对象包含有关其状态的可靠信息? 你不应该尝试使用已处理的会话,我不知道nhibernate在哪里处理你的会话,你确定你自己没有处理它吗?