gpt4 book ai didi

c# - OnRelease 期间的异常是否会导致组件无法正确处置?

转载 作者:行者123 更新时间:2023-11-30 17:19:13 25 4
gpt4 key购买 nike

我有以下代码在 Autofac 中为 ASP.NET 应用程序连接 NHibernate ISession:

builder.RegisterAdapter<ISessionFactory, ISession>(factory => factory.OpenSession())
.InstancePerHttpRequest()
.OnActivated(activatedArgs =>
{
var session = activatedArgs.Instance;
session.BeginTransaction();
})
.OnRelease(session =>
{
if (session.Transaction != null && session.Transaction.IsActive)
{
try
{
session.Transaction.Commit();
}
catch(Exception e)
{
session.Transaction.Rollback();
throw;
}
}
});

即使在提交中抛出异常, session 也会被正确处理吗?这是 ISession 与 autofac 的正确用法吗?

最佳答案

No- 在 Dispose() 中使用 Autofac 不是一个好主意。不能保证正确处置其他组件实例。

一般来说,应该避免这种情况——例如,WCF 有一个众所周知且长期存在的可用性问题,因为连接会在处理过程中抛出。基本反模式是 Dispose() 经常被调用,因为正在传播异常。抛出另一个异常掩盖了原来的异常

编辑:

作为一个思想实验——假设这是在 Autofac 中使用一些 try/catch 魔法来支持的。如果 OnRelease() 为两个不同的组件抛出异常会怎样?我们不能传播这两个异常。更进一步——一旦异常从 Autofac 中冒出,谁能捕捉到它?为请求提供服务的所有组件现已发布。

希望这对你有所帮助,尼克。

关于c# - OnRelease 期间的异常是否会导致组件无法正确处置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5134664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com