如何从应用程序的MEF容器中取消包含Field Imports的对象的链接?

时间:2011-01-21 02:55:50

标签: .net mef

我正在编写一个在.Net 4中使用MEF的WPF应用程序。我的应用程序有一个CompositionContainer,可以被我的所有视图模型访问,以便访问(使用MEF)一些负责数据检索的共享对象。存储

我一直在使用内存分析器查看我的一些视图模型对象的生命周期以及数据访问对象,以查看何时进行垃圾回收。令我惊讶的是,我发现我的应用程序的CompositionContainer在我们的视图模型被处理后仍然保留了对它的引用。

以下是我试图大致展示我如何使用MEF。我希望有人能告诉我,我做错了。

App.xaml.cs中的代码

public partial class App : Application
{
    private static CompositionContainer _container;
    internal static CompositionContainer Container { get { return _container; } }

    private void OnStartup(object sender, StartupEventArgs e)
    {
        AssemblyCatalog catalog = new  AssemblyCatalog(Assembly.GetExecutingAssembly());
        _container = new CompositionContainer(catalog);
    }
}

合约界面

  

public interface ICostCentreService:IBaseEntityService      {          ...      }

实现接口

的导出类
  

[PartCreationPolicy(CreationPolicy.Shared)]      [导出(typeof运算(ICostCentreService))]      公共类CostCentreService:BaseEntityService,ICostCentreService      {          ...      }

我的视图模型类

  

公共类CostCentreViewModel:ViewModelBase      {          [进口]          private ICostCentreService _costCentreService;

   public CostCentreViewModel()
   {
       App.Container.ComposeParts(this);
   }
     

}

希望上面的代码提取足够的图片来显示我如何使用MEF。一旦我完成使用视图模型并且我调用Dispose并删除对它的所有引用,就会出现问题,它不会被垃圾收集,因为应用程序的容器仍然引用它。 (在我目前在屏幕上的情况下,内存分析器说我的视图模型仍然被App._containner._partExportProvider._parts._items [0] ._ cashedIntance引用。)

所以我想知道如何摆脱这个参考。我没有正确使用MEF吗?

非常感谢任何帮助。

干杯,

Nick Barrett

1 个答案:

答案 0 :(得分:0)

在处置容器之前,不会释放共享部件。共享部分意味着每个容器只会创建一个。 MEF容器保留对它的引用,因为如果再次询问该部分,它应该返回已经创建的那个而不是创建一个全新的部分。

对于NonShared部件,有一些方法可以让MEF释放对它们的引用。