2010-07-12 4 views
1

Я только начинаю играть с MEF и задаю пару вопросов.вопросы об использовании MEF в службе WCF

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

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

ответ

2

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

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

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

+0

Спасибо, что нашли время Даниил. Да, я пробовал номер 1, не работал. Не уверен, почему, хотя и думаю об этом сейчас, мне интересно, могу ли я поместить его в отдельный класс, поэтому он основан на экземпляре, а не статичен, но ссылается на этот статический стат. Я попробую. На 2, я согласен. Но я надеялся, что отбросить DLL будет похоже на сброс изменения web.config, он автоматически переработает. Но я даже не могу отказаться от dll, не останавливая службу. –

Смежные вопросы