我知道MEF CompositionContainer创建并保留类的实例。我不知道在什么情况下,CompositionContainer的内容中有一个类实例。
答案 0 :(得分:2)
CompositionContainer将在CompositionContainer的生命周期内保留对所有共享部分的引用。 (默认的CreationPolicy对于导入和导出都是Any,这意味着默认情况下将共享所有部分,除非另有指定。)
如果零件实现IDisposable,将保留对NonShared零件的引用。当从容器中提取的根导出被释放时(如果该导出来自NonShared部分),将释放该引用。可以通过为ExportFactory创建的导出调用CompositionContainer.ReleaseExport或ExportLifetimeContext.Dispose来释放导出。
我认为没有任何简单的方法可以查看CompositionContainer所持有的内容。源代码可用,因此理论上可以深入了解它并确切地确定它的存储位置。
答案 1 :(得分:1)
关于你的第二个问题(上面的#2)......
使用QuickWatch窗口(Shift + F9)或常规Watch窗口,复制以下内容:
((System.ComponentModel.Composition.Hosting.CompositionContainer)(this.Container))._catalogExportProvider._activatedParts
上面的行假定您停止的对象具有“this.Container”属性,即您所引用范围的 CompositionContainer 。
从那里,您将获得一系列ActivatedParts。然后导航零件字典。找到要查找其实例的零件定义,并展开其“非公共成员”。在那里你会找到CachedInstance
,这将是你创建的“共享”导出部分的实例。
我认为导出NonShared而不是IDisposable的部件根本不会被缓存或保留。至少那是我见过的行为。