简短的最佳实践问题:如果一个对象A被注入到另一个对象B中,那么对象B是否应该实现IDisposable接口,并在B被处理时处理A?
我会说通常情况下不需要;依赖注入的本质意味着被注入的对象并不了解它所注入的对象的生命周期;在某种程度上,这就是注入的定义。因此,我认为被注入的对象不应该处理它所注入的对象;注入代码应该承担知道所有被注入对象的完整生命周期的责任,并且在所有操作完成后正确地处置它们,而不是提前。
(编辑:回答时,我没有清楚问题是关于IoC / DI的;我将其留在此处供参考,但请先查看已接受的答案。)
如果您所说的“注入”意味着B
承担A
的所有权,那么是的;例如,StreamReader
就是这样的一个例子。
如果它只是暂时使用A
(但A
仍然存在于B
之外),那么不是。
一些API允许您在构造函数中指定是否应该假定所有权(即是否清理注入的对象)。其中一个例子是GZipStream
。
我认为这可能会变得很主观。
归根结底,谁应该控制对象A的生命周期?
例如,假设对象C和D也将对象A注入其中,在这种情况下,您不希望对象B过早地处理对象A。
然而,在某些情况下,当您知道对象A的生命周期应该随着B的结束而结束时,让对象B处理对象A是完全适当的。
我的建议是,当B被处理时,不应该处理A。依赖注入的整个理念就是你不必担心接收到的对象的行为和生命周期,你只需要接收它们。
然而,你也希望确保对象在不再需要时尽快清理。也许可以创建一个小型事件系统,以便通知需要处理它?我想这取决于上下文。