Расширяемое приложение WPF - MEF, MAF или простая загрузка? - PullRequest
10 голосов
/ 24 июня 2010

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

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

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

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

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

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

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

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

1 Ответ

10 голосов
/ 24 июня 2010

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

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

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

...