IDisposable模式的一个有问题的例子?

uri*_*rig 6 c# dependency-injection idisposable inversion-of-control

假设您有3个实现IDisposable的类 - A,B和C.类A和B都依赖于C类.

  1. 说A类和B类的Dispose()的典型实现是:

    public void Dispose()
    {
        if (m_C != null) m_C.Dispose();
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果有一个A和B实例共享同一个C实例,你如何克服处理A实例会损坏B实例的问题?

  3. 最后一分钟附录 - 如果在第2点,它是一个DI容器,它实例化所有实例,谁负责处理这些对象?它是容器本身吗?怎么样?

谢谢,urig

Jon*_*eet 12

处置模式依赖于有一个成熟的"所有者"来决定何时应该处置资源.

如果A和B需要引用相同的C实例,那么其中只有一个应该作为"所有者".

虽然你可以做什么相当于引用计数,但我通常发现最好只记录谁"拥有"什么.例如,当您Bitmap使用流创建一个流时,从Bitmap拥有该流的那一点开始,您不应该自己处理它.这可能会导致一些问题,但最终比尝试挖掘引用计数更简单.

  • @urig:听起来它可能是最好的地方,是的.如果它意味着持续应用程序的持续时间,那么DI可能是最适合的"所有者". (2认同)