转移IDisposable对象的所有权和构建器设计模式

塞尔克斯

当对象是创建另一个对象(直接或通过工厂,构建者等)的对象时,我已经习惯了这种方法-是“拥有”该对象的对象,因此可以管理其生命周期。

这个想法在几乎所有情况下都适用。

但是有时创建对象的对象根本无法管理它,例如在构建器设计模式实现中:

IFoo BuildFoo()
{
    var dep = new Dep();

    return new Foo(dep);
}

因此,由于以下原因,构建器在这里无法管理dep对象的生存期

  1. 它没有提及它;
  2. 它不知道什么时候安全Dispose

天真的解决方案是制作Foo : IDisposable并让其管理Dep传递给其构造函数的内容。

但随后出现了另一个难题:

using (var dep = new Dep())
{
    using (var foo = new Foo(dep))
    {
        // (1) do something with foo
    }

    // (2) !!! do something with dep !!!
}

上面的代码变得不安全:在这一点上(2)dep它已经被Disposed使用,因此不安全foo

从句法上讲,没有什么可以表示,管理对象的生存期是谁的责任。

那么问题来了:什么是通用的解决方案?

尼尔·巴恩威尔

在这种情况下,我不必担心。我想我会在这里破土动工,但是“建造者”,“工厂”等都是我认为可以创建对象并将其交给需要它的对象的地方。

还有,虽然该建筑工地/工厂必须在规则创建的对象,而不是用它做任何事情。

当然,如果您使用new关键字更新对象,那么您会将自己与该实现耦合(即使它是通过工厂类间接实现的)。您可能要改为考虑依赖项注入,具体取决于创建对象的用途,在这种情况下,DI容器将创建对象根据其配置的生活方式在正确的时间为您处置它们。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TOP 榜单

热门标签

归档