如何使用托管扩展性框架releaseExport部件

时间:2011-04-05 11:09:05

标签: mef

我了解 CompositionContainer.ReleaseExport()的工作方式如下:

  1. 它执行部件的Dispose方法;
  2. 它从CompositionContainer中删除了部分。
  3. 我附上了一个简短的节目。程序运行时,我希望看到

    1. 文本“这是Foo.Dispose”在控制台窗口中,
    2. 在调试器中,composablePartCatalog.Parts计数应为零。
    3. 事实并非如此。任何人都可以对此有所了解吗?

      回应Daniel Plaisted的回复,我简化了示例程序。我仍然没有在控制台窗口中看到文本“这是Foo.Dispose”。

      
      namespace MefCa06
      {
        using System;
        using System.ComponentModel.Composition;
        using System.ComponentModel.Composition.Hosting;
        using System.Reflection;
      
        [
            ExportAttribute
          , PartCreationPolicyAttribute(CreationPolicy.NonShared)
        ]
        public class Foo : IDisposable
        {
          public void ShowMessage()
          {
            Console.WriteLine("this is Foo.ShowMessage");
          }
      
          public void Dispose()
          {
            Console.WriteLine("this is Foo.Dispose");
          }
        }
      
        class Program
        {
          [ImportAttribute]
          public Foo FooProperty { get; set; }
      
          static void Main(string[] args)
          {
            Program program = new Program();
      
            CompositionContainer compositionContainer =
              new CompositionContainer(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
            compositionContainer.ComposeParts(program);
      
            program.FooProperty.ShowMessage();
      
            Lazy<Foo> foo = compositionContainer.GetExport<Foo>();
            compositionContainer.ReleaseExport(foo);
      
            Console.ReadLine();
          }
        }
      }
      
      

1 个答案:

答案 0 :(得分:2)

您应该在控制台中看到“这是Foo.Dispose”。

目录中仍应包含该部分。目录包含零件定义,容器包含零件。 Foo的部分/实例将从容器中处理和删除,但定义仍将在目录中。由于定义仍在目录中,您可以使用另一个GetExport调用创建另一个。