【问题标题】:how do I releaseExport part using managed extensibility framework如何使用托管可扩展性框架释放导出部分
【发布时间】:2011-04-05 11:09:04
【问题描述】:

我了解 CompositionContainer.ReleaseExport() 的工作原理如下:

  1. 执行部件的 Dispose 方法;
  2. 它会从 CompositionContainer 中移除部件。

我附上了一个简短的程序。当程序运行时,我希望看到

  1. 在控制台窗口中输入“this is Foo.Dispose”,然后
  2. 在调试器中,composablePartCatalog.Parts 计数应为零。

不是这样的。有人能解释一下吗?

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

命名空间 MefCa06 { 使用系统; 使用 System.ComponentModel.Composition; 使用 System.ComponentModel.Composition.Hosting; 使用 System.Reflection; [ 导出属性 , PartCreationPolicyAttribute(CreationPolicy.NonShared) ] 公共类 Foo : IDisposable { 公共无效显示消息() { Console.WriteLine("这是 Foo.ShowMessage"); } 公共无效处置() { Console.WriteLine("这是 Foo.Dispose"); } } 课堂节目 { [导入属性] 公共 Foo FooProperty { 获取;放; } 静态无效主要(字符串 [] 参数) { 程序程序 = 新程序(); 组合容器组合容器 = 新的 CompositionContainer(新的 AssemblyCatalog(Assembly.GetExecutingAssembly())); compositionContainer.ComposeParts(程序); 程序.FooProperty.ShowMessage(); Lazy foo = compositionContainer.GetExport(); compositionContainer.ReleaseExport(foo); Console.ReadLine(); } } }

【问题讨论】:

    标签: mef


    【解决方案1】:

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

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

    【讨论】:

    • (1) 我更新了我的程序,简化了它。我没有看到“这是 Foo.Dispose”。你能解释一下为什么吗? (2) 您区分零件定义和零件。这是否意味着在您的最后一句话中,您的意思是:由于定义仍在目录中,您可以通过另一个 GetExport 调用创建另一个 PART?
    • @user669226 (1) 永远不会创建 Foo,因为您永远不会访问惰性的 Value 属性。所以没有什么可处置的。 (2) 是的,您可以创建另一个 PART。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多