【问题标题】:Does the MEF Container.Dispose dispose added catalogs?MEF Container.Dispose 是否处理添加的目录?
【发布时间】:2011-04-15 11:17:27
【问题描述】:

这类似于我的代码的样子

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

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

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

MEF 文档似乎没有提到这一点。

【问题讨论】:

    标签: mef


    【解决方案1】:

    根据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();
       }
    }
    

    【讨论】:

    • 啊!创建自定义子类技术:) 我的反射器副本用完了,那是星期五,所以把它贴在 SO 上。谢谢维姆!
    【解决方案2】:

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

    在很多情况下,有人希望与多个容器共享一个目录实例,这就是为什么容器没有 catlaog 的所有权,因此不会处置它。

    【讨论】:

    • 所有文档都没有强调这一点——示例通常采用var container = new CompositionContainer(new SomeCatalog()) 的形式。是否因为可以不处置目录 - 没有严重的资源挂起?
    • 默认目录只有锁,它们可能需要释放,但最终会被清除。通常,示例假设您有一个应用程序容器,一旦完成,您的应用程序就会关闭,此时任何操作系统资源都将被清理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多