当我创建一个对象并将其添加到容器中然后我已完成它时,我如何确保它被正确处理?
阅读http://msdn.microsoft.com/en-us/library/ee155691(v=vs.110).aspx说
对于长寿命的合成容器,按部件记忆消耗 使用非共享的创建策略可能会成为一个问题。这些 非共享部分可以多次创建,也不会创建 直到容器本身被丢弃为止。为了解决这个问题, 容器提供 ReleaseExport方法。调用此方法 在非共享导出上从组合中删除该导出 容器并处理它。仅由已删除的部件使用的部件 树下的出口等也被移除和处理。在 这样,可以在不处理组合物的情况下回收资源 容器本身。
例如,如果我在MEF上使用Caliburn.micro
之类的内容,并在ViewModel
关闭的情况下创建一个新的ViewModel
,如果我在ReleaseExport
上添加ReleaseExport
容器是否会清理引用,以便它不再占用内存? (这是正确的方式吗?)
调用{{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 共享导出它实际上只会对非共享导出执行任何操作 它将释放它并走它的依赖图释放它们但是 它将停止并对共享的任何依赖项不执行任何操作 出口。