我习惯于这种方式:当一个对象创建另一个对象时(直接或通过工厂、生成器等),它就“拥有”该对象,从而管理其生命周期。
这个思路在几乎所有情况下都很好用。
但有时候,创建对象的那个对象根本无法管理它,例如在生成器设计模式实现中:
IFoo BuildFoo()
{
var dep = new Dep();
return new Foo(dep);
}
因此,在这里构建器无法管理dep
对象的生命周期,因为:
- 它没有对它的引用;
- 它不知道什么时候可以安全地
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是不安全的,因为它已经被foo Dispose了。
并且没有任何语法可以表示谁负责管理对象的生命周期。
那么问题来了:有什么通用解决方案吗?
new
关键字 - 它们只是隐藏了您必须传递的所有依赖项。我还要再次提到 DI,因为我认为如果您在这个领域,这是一个有效的考虑。 - Neil Barnwellnew
语句几乎相同。DI容器只是更进一步。 - Neil Barnwell