注入的属性应该被释放吗?

6

简短的最佳实践问题:如果一个对象A被注入到另一个对象B中,那么对象B是否应该实现IDisposable接口,并在B被处理时处理A?

5个回答

5
如果你在谈论依赖注入模式,我认为这取决于Object B对Object A实现的了解程度。之所以要像这样进行依赖注入,通常是因为你事先不知道Object A将如何实现以及它是否需要IDisposable。你唯一知道的是接口。
在我看来,添加此行为会导致两个类之间的耦合更紧密。

5

我会说通常情况下不需要;依赖注入的本质意味着被注入的对象并不了解它所注入的对象的生命周期;在某种程度上,这就是注入的定义。因此,我认为被注入的对象不应该处理它所注入的对象;注入代码应该承担知道所有被注入对象的完整生命周期的责任,并且在所有操作完成后正确地处置它们,而不是提前。


2

(编辑:回答时,我没有清楚问题是关于IoC / DI的;我将其留在此处供参考,但请先查看已接受的答案。)

如果您所说的“注入”意味着B承担A的所有权,那么是的;例如,StreamReader就是这样的一个例子。

如果它只是暂时使用A(但A仍然存在于B之外),那么不是。

一些API允许您在构造函数中指定是否应该假定所有权(即是否清理注入的对象)。其中一个例子是GZipStream


1

我认为这可能会变得很主观。

归根结底,谁应该控制对象A的生命周期?

例如,假设对象C和D也将对象A注入其中,在这种情况下,您不希望对象B过早地处理对象A。

然而,在某些情况下,当您知道对象A的生命周期应该随着B的结束而结束时,让对象B处理对象A是完全适当的。


1

我的建议是,当B被处理时,不应该处理A。依赖注入的整个理念就是你不必担心接收到的对象的行为和生命周期,你只需要接收它们。

然而,你也希望确保对象在不再需要时尽快清理。也许可以创建一个小型事件系统,以便通知需要处理它?我想这取决于上下文。


在这种情况下,你需要一些引用计数的方法,以便在使用它的某些类被释放之前,对象A不会被丢弃。 - Erik Hellström

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接