2010-06-24 1 views
8

(я знаю о других вопросах MEF/MAF, но это более конкретная проблема)Расширяемое приложение WPF - MEF, MAF или простая загрузка?

Я хочу создать приложение WPF, который будет в основном быть только простой надстройкой хоста, GUI и настройки. Вся фактическая работа будет выполняться одним или несколькими плагинами. Им не нужно связываться между собой, основное приложение будет отправлять им пользовательский ввод/команды, и они возвратят некоторые результаты (например, элементы интерфейса WPF для рендеринга).

Теперь, поскольку ядро ​​приложения будет основано на плагинах, мне нужно выбрать хороший способ управления ими. Я хочу иметь возможность загружать/выгружать/перезагружать их во время выполнения (например, когда обновление найдено и загружается). Вероятно, они должны работать в собственном домене приложений и/или для обеспечения стабильности и безопасности.

Из некоторых исследований и экспериментов я пришел к трем вариантам:

  • System.AddIn (МАФ): Кажется, это может сделать все, что нужно. Существует конвейер, который позволяет одновременно запускать несколько версий API для совместимости и т. Д. Но если мне не хватает чего-то, мне нужно создать API несколько раз - представление хоста и плагина, контракт и два адаптера для контракта. Также мало информации (по сравнению с MEF) и ресурсов, и большинству статей несколько лет. Я беспокоюсь, что это медленно умирает и не будет использовать его для нового проекта.

  • MEF: Это одна кажется проще, но он также чувствует, что есть много магии, что я не могу контролировать, и слои не разделены так же, как и в МАФ. Я хочу только небольшую библиотеку, которую вы можете связать с новым проектом, реализовать интерфейс и сделать плагин.

  • Ручная загрузка: Последний вариант будет папка вручную сканировании .dlls, использование отражение, чтобы найти плагин классы и создавать экземпляры. Хотя это выполнимо, я предпочел бы использовать некоторые рамки, чем вручную загружать сборки, создать отдельный процесс/AppDomain и т.д.

Итак, что один будет лучше для такого рода приложений, или есть что-то, что я вы пропустили?

+0

Настоящий опрятный предмет. пара хорошие статьи; http://pwlodek.blogspot.com/2011/07/isolating-mef-components.html и http://blogs.msdn.com/b/tilovell/archive/2011/08/19/wf4-hosting-the- workflowdesigner или-другой-МОФ-материал-в-отдельном-AppDomain.aspx – Will

ответ

9

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

Это на самом деле механизм «плагина», используемый Visual Studio, который является приложением WPF. Все, что вам нужно сделать, это заставить ваш «плагин» реализовать интерфейс или получить из известного базового класса и добавить атрибут [Export]. При условии, что сборка добавлена ​​в каталог вашего основного приложения, этот тип может быть [Import] из основного приложения за один шаг. Работа над этой работой очень мало.

Это была бы моя рекомендация, если нет веских причин пойти другим вариантом. MAF имеет больше поддержки изоляции, но гораздо сложнее в использовании, и большинство функций изоляции не будут использоваться в приложении WPF, поскольку пользовательский интерфейс в WPF не может быть действительно изолированным кодом в любом случае.

+0

«... поскольку пользовательский интерфейс WPF не может быть изолирован ...» Не уверен, что вы имеете в виду. Мне нужно приложение, чтобы вернуть некоторый пользовательский интерфейс, например кнопку. Это будет отображаться главным приложением, но оно может вернуть обратный вызов к плагину. Возможно ли сделать плагин запущенным в разных приложениях, чтобы предотвратить его сбой всего приложения и, возможно, обеспечить некоторую изоляцию для плагинов с низким доверием? – lacop

+0

@ Iacop: Я бы использовал MEF для этого. Вы не можете изолировать пользовательский интерфейс в отдельном AppDomain, так как он должен использоваться вашей оболочкой (именно это я и имел в виду). Если вы делаете это для расширяемости пользовательского интерфейса, изоляция AppDomain, предоставляемая MAF, непригодна, поскольку пользовательский интерфейс всегда существует в Single main AppDomain (в WPF) и не может пересекать AppDomains. –

+1

Если вы используете MAF для чисто алгоритмических плагинов, у которых нет кода пользовательского интерфейса, можно изолировать плагин в отдельном AppDomain, но с расширяемостью пользовательского интерфейса это не работает, поэтому вы теряете единственное преимущество для MAF - вот почему я сказал бы пойти с MEF (он намного более гибкий, лучше поддерживается, проще в использовании и т. д.). –