2

我正试图围绕部分生命周期和所有权。我知道共享部分的生命周期将限定在容器中。但是非共享实例呢?它说容器不会保存对创建的部件的引用,除非它是共享的或实现 IDisposable,但它还说容器创建的所有部件都以容器的生命周期为条件,摆脱它们的唯一方法是处置容器。

那么它是哪一个?容器是否包含对它创建的所有部分的引用,或者仅包含符合特定条件的部分?我也很困惑,因为它说容器永远不会转移它创建的部件的所有权。但是,如果它不包含对非共享部分(未实现 IDispoable)的引用,那么它实际上不会将所有权转移给请求者吗?

来源:http ://mef.codeplex.com/wikipage?title=Parts%20Lifetime&referringTitle=Guide

4

1 回答 1

2

当您从非托管语言的角度考虑“活着”时,您的反对是有道理的。例如在 C++ 中,在堆上分配的任何对象都需要在某个时候被释放,这将是容器的责任。所以容器需要保留对它创建的所有对象的引用,并在某个时候释放它们。

但是,在 .NET 运行时,垃圾收集器将负责回收内存。所以容器只需要保留对实例的引用,如果它在处理未来的部件请求时可能被重用(即它是共享的),或者如果它需要在某个时候被释放。

如果这些条件都不成立,那么可以放心地忽略生命周期和所有权的概念。重要的是,只要有对它的引用,该对象就可以使用,而垃圾收集器将确保这一点。

所以回答你的问题:它只保留对符合特定条件的对象的引用。但是,这并不意味着您可以继续调用container.GetExportedValue并期望没有内存泄漏。考虑如果您请求的非一次性对象具有一次性依赖项会发生什么。容器仍将保留对这些的引用!

因此,如果要通过容器动态创建对象,最好ExportFactory改用(在.NET 4.5 中引入)。这样,即使对象不是一次性的,您也可以重新引入“生命周期”的概念,并且容器将确保在您使用ExportLifetimeContext<T>.Dispose.

于 2012-06-11T11:07:03.113 回答