MEF重组 - 它是否保留现有实例?

时间:2010-07-06 18:13:44

标签: c# mef

假设我有这样的MEF成分:

public class Composition
{
    [ImportMany(AllowRecomposition = true)]
    IEnumerable<ILongRunningProcess> Processes { get; set; }

    public static void Main(string[] args)
    {
         var composition = new Composition();
         using (var catalog = new DirectoryCatalog("."))
         {
             using (var container = new CompositionContainer(catalog)
             {
                 container.SatisfyImportsOnce(composition);
                 //Fire off long running processes in response to stimuli
             }
         }
    }
}

根据我见过的文档,我“在使用重构时必须考虑线程安全性。”[MSDN]

显然,对于我删除类型的情况,我需要确保我的长期运行过程可以安全地进行垃圾收集。但是对于在重构之前存在并且在重构后仍然存在的类型,每当重构时,我是否会为Processes的内容返回新实例,或者当重构目录时MEF是否能够保留现有的导入实例?

基于上述文章的建议,对于ICollection<T> MEF将使用Clear()Add(T)方法,我没有希望,但我想知道我之前的确定去写同步代码。

编辑我刚才意识到我不能在静态方法中使用this;我相应地更新了代码:)

1 个答案:

答案 0 :(得分:0)

除非将ILongRunningProcess导出的类型的零件创建策略设置为NonShared,否则您将获得相同的实例。

但这并不是一个线程安全问题。您确实希望确保在重构​​时,没有任何东西正在访问MEF容器(其中包括访问MEF提供的Lazy的Value属性等内容)。因此,如果长时间运行的进程在另一个线程上运行并且它有自己的导入,则可能会出现线程问题。