dotnet core对象管理为什么复杂了许多?

说个例子,我最近对SqlConnection对象做了一次封装,这个类叫SqlConnectionBaBa。我在构建这个对象的时候会把SqlConnection对象传进去。首先说明,这里是dotnet core 3.0环境。我在main方法里面new SqlConnectionBaBa() 赋给B1,并且new SqlConnection()给S1,并且我把S1交给B1。当我想要把B1指向Null,然后调用GC.Collect()方法,祈求将刚刚new 出来的SqlConnectionBaBa对象回收掉,但是我发现不生效。这是一件无可奈何的事情。

后来想想,我觉得试一下dotnet core主机的依赖注入容器来对对象进行管理,我把B1对象注入到容器,并且用Scope的方式来获取对象。通过观察,我发现,B1对象是释放了,但是S1对象没有释放。后来我给B1对象实现IDisposable接口,我发现在跳出Scope域的时候B1对象的Dispose()方法是又被执行的,所以更加验证了B1对象是释放了,同时也说明了,dotnet core主机的注入容器里所管理的对象,针对实现了IDisposable接口的,会在它生命周期结束的时候执行Dispose()方法。但是刚刚的问题还在,S1对象没有释放,那怎么办,我觉得我过于关注对象的释放是不是在于对象被销毁,我觉得托管对象我们关注的不该是它的销毁性,而是它对资源占用的释放性。对SqlConnection对象我们都知道它是对系统底层的管道有占用的,所以我们在不用的时候要及时把它给关闭,就是我们称为释放资源,那我先前在SqlConnectionBaBa对SqlConnection作了封装。所以,重点,我们需要在SqlConnectionBaBa释放的时候也释放SqlConnection,这样就完美的解决了SqlConnectionBaBa对象释放了,但是SqlConnection还在占用资源的情况。

posted @ 2020-07-07 13:47  重案之虎柒Tou  阅读(106)  评论(0)    收藏  举报