代码之家  ›  专栏  ›  技术社区  ›  Matt Mills

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

  •  1
  • Matt Mills  · 技术社区  · 14 年前

    假设我有这样一个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> Clear() Add(T) 方法,我不抱希望,但我想在编写同步代码之前确定一下。

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

    1 回复  |  直到 14 年前
        1
  •  0
  •   Daniel Plaisted    14 年前

    您将获得相同的实例,除非 ILongRunningProcess

    但这并不是真正的线程安全问题。您确实希望确保在发生重新编译时,没有任何内容正在访问MEF容器(其中包括访问MEF提供的Lazy的Value属性之类的内容)。因此,如果长时间运行的进程在不同的线程上运行,并且它有自己的导入,则可能会出现线程问题。