在 Unity 中配置 base class 的最佳做法是什么

What is the best practice to dispose base class in Unity

我有以下结构。我感到困惑的是如何处理 PhoneBase。我不知道 Unity 是否处理 PhoneBase.

public class PhoneBase : IDisposable
{
    protected int GetSignal()
    {
    }

    //something needs to dispose
    public void Dispose()
    {
    }
}

public interface IMyPhone
{
    void SwitchOn();
    void SwitchOff();
}

public class MyPhone : PhoneBase, IMyPhone
{
    public void SwitchOn()
    {
        //implement
    }

    public void SwitchOff()
    {
        //implement
    }

}

public class PhoneQuestionController : Controller
{
    IMyPhone myPhone;
    public PhoneQuestionController(IMyPhone myPhone)
    {
        this.myPhone = myPhone;
    }
}

我是否应该将 Dispose 方法放在 IMyPhone 接口中,然后在重写控制器的 Dispose 时调用它,如下所示?或者有更好的方法吗?

public interface IMyPhone
{
    void SwitchOn();
    void SwitchOff();
    void Dispose();
}

public class PhoneQuestionController : Controller
{
    IMyPhone myPhone;
    public PhoneQuestionController(IMyPhone myPhone)
    {
        this.myPhone = myPhone;
    }

    override Dispose(bool disposing)
    {
        base.Dispose(disposing);
        myPhone.Dispose();
    }
}

我认为您不了解 IDisposable 的目的。 class 如果 拥有 本身是可支配的资源,则它应该只实现 IDisposable。这意味着 class 实际上必须是新的东西, 而不是 被注入。 class 不应该处理注入的资源;这是对象生命周期管理器的工作 - 在这种情况下是 Unity。

假设 PhoneBase 确实拥有一些一次性资源,那么 MyPhone 将继承此资源和 IDisposable 实现。事实上,PhoneBase 在这种情况下甚至不存在。它不像 MyPhone 以某种方式具有对 PhoneBase 实例的内部引用。您所拥有的只是一个 MyPhone 实例,具有与 PhoneBase 相同的所有属性和方法,以及在其上专门定义的任何内容。

然后,如果您注入 MyPhone 代替 IMyPhone,Unity 是拥有该对象的实体,因此是负责处理它的实体(它将执行此操作,在其生命周期结束时,如您的 DI 配置中所定义)。你的控制器应该绝对不要处理掉它。时期。控制器不拥有它,如果 Unity 将它注入到其他任何地方,您将在其他实例中遇到异常,因为该对象未被正确处理。

附带说明一下,不正确地实现和使用 IDisposable 比不处理你应该处理的对象要糟糕得多。最终,GC 将处理遗留的任何内容。手动处理只是很好的家务管理。但是,处置不当会导致内存泄漏、抛出异常并给您的应用程序带来各种麻烦。因此,标准建议是,只有当您知道自己在做什么以及确切地知道为什么要这样做时,才应该实施 IDisposable。如果您不确定,请不要执行它。