вопросы по использованию MEF в сервисе WCF - PullRequest
1 голос
/ 12 июля 2010

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

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

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

1 Ответ

2 голосов
/ 14 июля 2010

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

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

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

...