MEF和对象处理

时间:2014-03-29 18:45:17

标签: c# mef caliburn.micro

当我创建一个对象并将其添加到容器中然后我已完成它时,我如何确保它被正确处理?

阅读http://msdn.microsoft.com/en-us/library/ee155691(v=vs.110).aspx

  

对于长寿命的合成容器,按部件记忆消耗   使用非共享的创建策略可能会成为一个问题。这些   非共享部分可以多次创建,也不会创建   直到容器本身被丢弃为止。为了解决这个问题,   容器提供 ReleaseExport方法。调用此方法   在非共享导出上从组合中删除该导出   容器并处理它。仅由已删除的部件使用的部件   树下的出口等也被移除和处理。在   这样,可以在不处理组合物的情况下回收资源   容器本身。

例如,如果我在MEF上使用Caliburn.micro之类的内容,并在ViewModel关闭的情况下创建一个新的ViewModel,如果我在ReleaseExport上添加ReleaseExport容器是否会清理引用,以便它不再占用内存? (这是正确的方式吗?)

调用{{1}}也阻止我将来创建该类型的另一个对象,或者目录是否仍包含该项目,我可以随时重新创建它?

1 个答案:

答案 0 :(得分:4)

MEF允许两种类型的导出 - 共享和非共享。

共享导出就像单身人士 - 每个消费者共享同一个实例。这些共享实例由MEF直接管理。当您在MEF容器上调用Dispose()时,它会按照与导入相反的顺序自动释放这些对象。

非共享资源更复杂。由于存在多个实例,因此MEF无法保证正确的发布顺序。在这种情况下,您应遵循与调用Dispose()相同的准则,以确定何时释放导入的对象。

每个非共享MEF导入的对象都应该有一个所有者负责其生命周期 - 通常是首先导入它的父对象。一旦父对象确保没有人使用此导入的对象,它就会在其上调用ReleaseExport。典型的模式是在所有者对象的Dispose()中释放导入的对象。

class OwnerClass : IDisposable
{
    [Import(RequiredCreationPolicy=CreationPolicy.NonShared)]
    private ConsumedClass myInstance;

    [Import(RequiredCreationPolicy=CreationPolicy.Shared)]
    private CompositionContainer container;

    // Do stuff

    public void Dispose()
    {
        container.ReleaseExport(myInstance);
    {
}

调用ReleaseExport从容器中释放该特定实例。该定义保留在目录中。所以你仍然可以创建更多的实例。这是一个很好的讨论:

https://mef.codeplex.com/discussions/228535

  

ReleaseExport的工作是清理特定的导出,它就是   早期的容器依赖,意味着在处置之前   容器本身将清理和处理所有对象   由容器构造。现在调用ReleaseExport即可   不同的东西取决于特定的出口,例如a   共享导出它实际上只会对非共享导出执行任何操作   它将释放它并走它的依赖图释放它们但是   它将停止并对共享的任何依赖项不执行任何操作   出口。