当前位置: 首页 > 编程语言 > C#

如何从MEF容器中释放共享实例Share

时间:2023-04-10 20:46:51 C#

如何从MEF容器中释放共享实例我正在尝试释放共享实例或单例值。有谁知道如何做到这一点?我需要刷新目录吗?我正在学习MEF,所以请帮忙。类[Export]示例publicclassFoo{publicRandomProperty{get;set;}[ImportConstructor]publicFoo(){}}您可以使用以下方法创建它:varfooSingleton=ServiceLocator.GetInstance(typeof(Foo));一切都很好,但理想情况下我想做一些像Container.Replace(oldFoo,newFoo);所以当我再次打电话时varfooSingleton=ServiceLocator.GetInstance(typeof(Foo));fooSingleton将具有新值。我认为答案可能取决于实际清理目录然后刷新它——但这对于如此简单的事情来说似乎有点过分了。默认情况下,在MEF中,当创建导出时,它是共享的。在许多其他容器中,这被称为单例生活方式。这意味着释放导出将不起作用,因为容器需要为其他潜在消费者保留导出。您面前有2个选择:假设您已处理完容器,则处置容器。这是合适的,例如,当应用程序关闭时。将部件更改为临时对象,即每次从容器请求部件时都会创建一个新部件。要在MEF中执行此操作,请将PartCreationPolicy属性添加到Export,指定它是非共享的。这看起来像这样:[PartCreationPolicy(CreationPolicy.NonShared)]。这将导致在调用container.ReleaseExport(myExport)时在小部件上调用Dispose方法,其中myExport是为发布而保留的导出(不是导出值)。这是一个示例:varcatalog=newAggregateCatalog(//代码省略);varcontainer=newCompositionContainer(catalog);懒惰的myExport=container.GetExport();//lateron...container.ReleaseExport(myExport)这表明您需要在可以访问MEF容器的地方执行此操作,并且必须保留对导出的引用。不过要小心。更改为临时对象而不是单例将影响容器的性能,因为反射用于创建每个新对象。由于您使用的是共享创建策略,因此容器将保留对已创建部分的引用。释放部分的方法是从容器中获取包含的导出,然后释放。varexport=container.GetExport();容器.ReleaseExport(导出);您可能需要更新您的消费类型(您的导入所在的位置)以支持重组。以上就是C#学习教程:如何从MEF容器中释放共享实例共享的所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处: