MEF Container.Dispose是否处理了添加的目录?

时间:2011-04-15 11:17:27

标签: mef

这与我的代码看起来类似

var catalog = new AssemblyCatalog(typeof(Program).Assembly);
_container = new CompositionContainer(catalog);

代码分析显示警告CA2000:在对所有引用超出范围之前调用目录上的Dispose。

所以我不确定是否需要禁止警告或将_catalog转换为字段+处理它。

MEF Docs似乎没有提到这一点。

2 个答案:

答案 0 :(得分:4)

根据MEF Preview 9源代码(可能与.NET 4中提供的代码非常匹配)CompositionContainer将目录包装在CatalogExportProvider中。此导出提供程序存储在字段中,并与容器一起放置。但是,CatalogExportProvider.Dispose依次处理已包装的ComposablePartCatalog

因此答案是否定的:CompositionContainer不会处理目录。

您可以通过运行此代码来验证这一点,该代码不会向控制台打印任何内容:

class MyCatalog : ComposablePartCatalog
{
   protected override void Dispose(bool disposing)
   {
      Console.WriteLine("Disposed!");
      base.Dispose();
   }

   public override IQueryable<ComposablePartDefinition> Parts
   {
      get { throw new NotImplementedException(); }
   }
}

class Program
{
   static void Main(string[] args)
   {
      var container = new CompositionContainer(new MyCatalog());
      container.Dispose();
      Console.ReadKey();
   }
}

答案 1 :(得分:3)

由于Wim已经发现CompsitionContainer和CatalogExportProvider都不会在目录上调用dispose。他们都没有创建目录,因此他们都没有拥有它,因此不会调用Dispose。构建目录的人应该是处理目录的人。

在很多情况下,有人想要与多个容器共享一个目录实例,这就是容器没有catlaog所有权的原因,因此不会将其丢弃。