【发布时间】:2009-05-21 12:12:39
【问题描述】:
简短的最佳实践问题:如果一个对象 A 被注入到另一个对象 B 中,那么对象 B 是否应该实现 IDisposable 并在释放 B 时释放 A?
【问题讨论】:
标签: c#
简短的最佳实践问题:如果一个对象 A 被注入到另一个对象 B 中,那么对象 B 是否应该实现 IDisposable 并在释放 B 时释放 A?
【问题讨论】:
标签: c#
如果你指的是dependency injection模式,我认为这取决于对象B中关于对象A实现的知识。像这样进行依赖注入的原因通常是因为你事先不知道如何对象 A 将被实现以及它是否需要 IDisposable。你唯一知道的就是界面。
添加此行为将导致两个类之间更紧密的耦合,IMO。
【讨论】:
我通常会说不;依赖注入的本质意味着被注入的对象对注入对象的生命周期知之甚少;在某种程度上,这就是注入的定义。因此,我认为注入的对象不应该处理注入的任何东西。注入代码应该负责了解它正在注入的所有对象的完整生命周期,并且应该能够在对它们的所有操作完成时正确地处理它们,而不是之前。
【讨论】:
(编辑:回答时,我不清楚这个问题是关于 IoC/DI 的;我将把它留在这里以供参考,但请先查看已接受的答案)。
如果“注入”是指B 拥有A 的所有权,那么是的;例如StreamReader。
如果它只是使用 A 一段时间(但A 继续存在于B 之外),那么不会。
某些 API 允许您(在构造函数上)指定是否应假定所有权(即是否清理注入的对象)。 GZipStream 就是一个例子。
【讨论】:
我认为这最终会变得很主观。
归结为,谁应该控制对象 A 的生命周期?
例如,对象 C 和 D 也有对象 A 注入其中,在这种情况下,您不希望对象 B 过早地处理对象 A。
但是,在某些情况下,当您知道对象 A 的生命周期应该以 B 结束时,让对象 B 处理对象 A 是完全合适的。
【讨论】:
我的 2p 会争辩说,当 B 被处置时,A 不应该被处置。依赖注入的整个想法是,您不必担心接收到的对象的行为和生命周期,您只需将它们交给它们。
然后,您再次希望确保对象在不再需要时立即被清理。也许创建一个迷你事件系统,以便您可以通知需要处理它?我想这真的取决于上下文。
【讨论】: