处置构造函数注入对象

SwD*_*n81 3 c# dependency-injection idisposable winforms

假设我有一个与另一个班级相关联的班级.它看起来像下面这样:

public class DisposableClassOne : IDisposable
{
   private class mDisposableClassTwo;

   public DisplosableClassOne(DisposableClassTwo dcTwoInjected)
   {
      mDisposableClassTwo = dcTwoInjected;
   }

   public void Dispose()
   {
      // Should I dispose here? or make caller dispose of dcTwoInjected
      //mDisposableClassTwo.Dispose();
   }
}
Run Code Online (Sandbox Code Playgroud)

我应该调用Dispose方法mDisposableClassTwo还是应该让调用者像这样处理它?

using(DisposableClassTwo dcTwoInjected = new DisposableClassTwo())
using(DisposableClassOne dcOne = new DisposableClassOne(dcTwoInjected))
{
   // do stuff with dcOne
}
Run Code Online (Sandbox Code Playgroud)

我正在考虑让调用者处理它是最好的方法,但我认为通过在Dispose方法中调用它可以保证它会被调用.有没有更好的方法来处理这个?

LBu*_*kin 5

如果您创建的类在逻辑上拥有(1)构造函数注入的资源,那么它应该在内部处理它.如果它不拥有资源,那么它应该什么都不做,并依靠消费者决定何时应该处理它.

如果您的类拥有对非托管资源的引用,您可能还需要实现终结器(析构函数),因为无法保证任何人都可以调用您的Dispose方法.

通常,您希望避免调用者必须决定何时应该处理传递给类的构造函数的对象的情况.调用者可能过早地处理资源(或者保持不必要的时间).在某些设计中实现这并不总是一件容易的事情......遗憾的是,一次性对象模式并不总是与自身完全一致.


(1)所有权我的意思是你的类控制它传递的资源的生命周期,没有其他代码持有对它的引用.如果任何其他代码(其生命周期与您的类的生命周期无关)拥有对资源的引用并将独立使用它,那么您不是该资源的所有者.