Перекомпоновка 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 в статическом методе; Соответственно обновил код :)


c# mef
person Matt Mills    schedule 06.07.2010    source источник


Ответы (1)


Вы получите те же экземпляры обратно, если для типов с ILongRunningProcess экспортами в политике создания частей не задано значение NonShared.

Однако на самом деле это не проблема безопасности потоков. Вы действительно хотите убедиться, что при перекомпоновке ничто не обращается к контейнеру MEF (который включает такие вещи, как доступ к свойству Value объекта Lazy, предоставляемого MEF). Поэтому, если ваш длительный процесс выполняется в другом потоке и имеет собственный импорт, у вас могут возникнуть проблемы с потоками.

person Daniel Plaisted    schedule 06.07.2010
comment
Под термином потокобезопасность я подразумеваю то, что я хочу убедиться, что у меня есть способ детерминированно остановить эти процессы, чтобы их обработка могла быть возобновлена следующим экземпляром. При изменении каталога их может быть запущено любое количество, и их работу необходимо возобновить. Полагаю, это не соответствует классическому определению. Я постараюсь придумать более подходящий заголовок для вопроса. - person Matt Mills; 07.07.2010