我试图围绕部分生命周期和所有权。我知道共享部分的生命周期将限制在容器中。但是非共享实例呢?它表示容器不会保留对创建的零件的引用,除非它共享或实现IDisposable,但它还说容器创建的所有零件都以容器生命周期为条件摆脱它们的唯一方法是处置容器。
那是哪个?容器是否包含对其创建的所有零件的引用,或仅包含符合特定条件的零件?我也很困惑,因为它说容器永远不会转移它创建的部件的所有权。但是,如果它没有引用非共享部分(不能实现IDispoable),那么它实际上不会将所有权转移给请求者吗?
来源:http://mef.codeplex.com/wikipage?title=Parts%20Lifetime&referringTitle=Guide
答案 0 :(得分:2)
当你想到生存时,你的异议是有道理的。就非托管语言而言。例如,在C ++中,需要在某个时刻释放在堆上分配的任何对象,这将是容器的责任。因此容器需要保持对所有所创建对象的引用,并在某些时候释放它们。
但是,在.NET运行时中,垃圾收集器将负责回收内存。因此,如果在处理将来的部件请求时(即,它是共享),或者如果需要在某个时刻处置它,容器只需要保留对实例的引用。
如果这些条件都不成立,那么可以安全地忽略生命和所有权的概念。重要的是只要有对象的引用就可以使用该对象,垃圾收集器将确保该对象。
所以回答你的问题:它只将引用到符合特定条件的对象。但是,这并不意味着您可以继续调用container.GetExportedValue
并期望没有内存泄漏。考虑如果您请求的非一次性对象具有一次性依赖性会发生什么。容器仍将保留对这些的引用!
因此,如果要通过容器动态创建对象,最好使用ExportFactory
代替(在.NET 4.5中引入)。通过这种方式,您可以重新引入&#34; life&#34;即使对象不是一次性的,并且当您使用ExportLifetimeContext<T>.Dispose
发信号时,容器将确保清除非共享依赖项。