mef中由组合容器持有的类的实例

时间:2011-04-12 10:26:45

标签: mef

我知道MEF CompositionContainer创建并保留类的实例。我不知道在什么情况下,CompositionContainer的内容中有一个类实例。

  1. 任何人都可以列出在CompositionContainer或CompositionContainer类的方法上执行的操作,这些操作会导致CompositionContainer在CompositionContainer中存储类的实例。
  2. 是否可以在调试器中以任何其他方式查看CompositionContainer中保存的类实例?

2 个答案:

答案 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的部件根本不会被缓存或保留。至少那是我见过的行为。

Quick Watch