注册为InstancePerRequest的SqlConnection:需Close还是Dispose?
关于Autofac中InstancePerRequest注册SqlConnection的释放问题
结论:不需要手动调用Close()或Dispose(),依赖Autofac的生命周期管理即可。
Autofac的InstancePerRequest生命周期特性:
注册为InstancePerRequest的对象,Autofac会在整个请求流程结束后,自动调用其Dispose方法(只要对象实现了IDisposable接口)。SqlConnection本身实现了IDisposable,其Dispose方法内部会自动完成连接关闭、归还连接池等操作。你在注册时调用.Open()打开的连接,会在请求周期内被多个仓储共享,请求结束后由Autofac统一清理。SqlConnection的原生设计逻辑:
SqlConnection的Dispose方法会隐式触发Close(),同时释放所有关联的非托管资源,比单独调用Close()更彻底。如果手动调用Close(),一旦后续代码抛出异常,可能导致Close()无法执行,而Autofac的自动清理机制能保证即使请求过程中出现错误,Dispose也会被执行。多仓储共享连接的安全性:
只要所有仓储都是在同一个请求生命周期内获取的该连接实例,Autofac会跟踪对象的引用情况,确保Dispose只被调用一次,不会出现重复释放导致的异常。
内容的提问来源于stack exchange,提问作者Askish
相关产品推荐
相关产品推荐

