вопросы об использовании MEF в службе WCF

Я только начинаю играть с MEF и у меня есть пара вопросов.

1) Я написал службу WCF, которая принимает некоторый xml и передает xml синтаксическому анализатору. Парсеры составлены с использованием MEF. (метаданные в xml позволяют мне определить, какой синтаксический анализатор использовать). Я могу добавить новый синтаксический анализатор и поддерживать новый XML, просто поместив dll в каталог. В этой части все работает. Но службы WCF могут создаваться несколько раз, я хочу, чтобы мой каталог синтаксического анализатора был статическим, то есть, если несколько экземпляров моей службы развернуты и они получают один и тот же XML, мне нужен только один работающий экземпляр синтаксического анализатора, они написаны, чтобы быть потокобезопасными. Я не могу настроить MEF для этого. Кто-нибудь знает, как?

2) Я могу добавить новый анализатор в каталог, и обновление каталога автоматически обнаружит его, и это прекрасно работает. Но если я попытаюсь закинуть в каталог модифицированную dll, а этот синтаксический анализатор был активирован в службе, я получаю сообщение об ошибке, говорящее, что файл используется. Есть ли способ переопределить это?


person Ken Foster    schedule 12.07.2010    source источник


Ответы (1)


1) Похоже, вы должны сделать свой MEF-контейнер и каталоги статическими, чтобы они создавались только один раз. Убедитесь, что вы указали, что CompositionContainer должен быть потокобезопасным, используя конструктор с параметром isThreadSafe и установив для него значение true.

2) Вы можете включить теневое копирование, которое предотвратит блокировку файла при загрузке DLL. Однако вы не можете выгружать библиотеки DLL из AppDomain в .NET, и, кроме того, небезопасно перекомпоновывать CompositionContainer, который можно использовать в нескольких потоках. Другими словами, использование параметра isThreadSafe делает контейнер потокобезопасным только для "чтения"/вытягивания экспортов из контейнера, а не для его изменения посредством композиции/рекомпозиции.

Поэтому, если вы хотите добавить новый парсер, вероятно, лучше всего перезапустить службу.

person Daniel Plaisted    schedule 14.07.2010
comment
Спасибо, что нашли время Даниил. Да, я пробовал номер 1, не сработало. Не уверен, почему, хотя и думаю об этом сейчас, мне интересно, могу ли я поместить его в отдельный класс, чтобы он был основан на экземпляре, а не статичен, но сделал ссылку на этот класс статической. Я попробую это. На 2 согласен. Но я надеялся, что удаление DLL будет похоже на удаление изменения web.config, оно автоматически вызывает перезапуск. Но я не могу даже сбросить dll, не остановив службу. - person Ken Foster; 14.07.2010