gpt4 book ai didi

c# - 如何从 MEF 容器中释放共享实例

转载 作者:太空狗 更新时间:2023-10-29 23:34:26 25 4
gpt4 key购买 nike

我正在尝试释放共享实例或单例值。有谁知道如何做到这一点?我必须刷新目录吗?我正在学习 MEF,所以请帮忙。

类的例子

[Export]
public class Foo
{
public RandomProperty {get;set;}

[ImportConstructor]
public Foo() {}
}

你可以用这样的东西来创建它:

var fooSingleton = ServiceLocator.GetInstance(typeof(Foo));

一切都很好,但理想情况下我想做这样的事情

Container.Replace(oldFoo, newFoo);

所以当我再次调用它的时候

var fooSingleton = ServiceLocator.GetInstance(typeof(Foo));

fooSingleton 将具有新值。

我认为答案可能取决于实际清除目录然后刷新它 - 但对于这样一个简单的事情来说这似乎有点过分了。

最佳答案

默认情况下,在 MEF 中,当您创建导出时,它是共享的。在许多其他容器中,这被称为单例生活方式。这意味着释放导出将无济于事,因为容器需要为其他潜在消费者保留导出。

您面前确实有 2 个选择:

  1. 处理容器,假设你已经完成了它。例如,当应用程序关闭时,这是合适的。
  2. 将您的部件更改为临时对象,即每次您从容器中请求一个部件时都会创建一个新部件。要在 MEF 中执行此操作,请将 PartCreationPolicy 属性添加到导出并指定它是非共享的。这看起来像这样:[PartCreationPolicy (CreationPolicy.NonShared)]。当 container.ReleaseExport(myExport) 被调用时,这将导致在您的部件上调用 Dispose 方法,其中 myExport 是一个导出(不是一个导出值)保留以用于发布目的。

这是一个例子:

var catalog = new AggregateCatalog(// code elided);
var container = new CompositionContainer(catalog);

Lazy<IMyExportInterface> myExport = container.GetExport<IMyExportInterface>();
// later on...
container.ReleaseExport(myExport)

这表明您需要在有权访问 MEF 容器的地方以及在保留对导出的引用的地方执行此操作。

但是请注意。更改为 transient 对象而不是单例将影响容器的性能,因为反射用于创建每个新对象。

关于c# - 如何从 MEF 容器中释放共享实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5433444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com