Выбор между MEF и MAF (System.AddIn)

Платформа управляемой расширяемости (MEF) и структура управляемых надстроек (MAF, также известная как System.AddIn), похоже, решают очень похожие задачи. Согласно этому вопросу о переполнении стека, Является ли MEF заменой System.Addin?, вы даже можете использовать оба одновременно.

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


person dthrasher    schedule 07.05.2009    source источник


Ответы (7)


Я оценивал эти варианты и вот к чему пришел.

MAF - это настоящая аддонная структура. Вы можете полностью разделить свои надстройки, даже запустив их в отдельном домене приложения, чтобы в случае сбоя надстройки оно не остановило ваше приложение. Он также предоставляет очень полный способ развязать аддоны от чего-либо, кроме контракта, который вы им даете. Фактически, вы можете управлять версиями своих контрактных адаптеров, чтобы обеспечить обратную совместимость со старыми надстройками при обновлении основного приложения. Хотя это звучит великолепно, это дорого обходится вам за пересечение доменов приложений. Вы платите эту цену за скорость, а также за гибкость типов, которые вы можете отправлять туда и обратно.

MEF больше похож на инъекцию зависимостей с некоторыми дополнительными преимуществами, такими как обнаруживаемость и ... (на этом рисуем пробел). Степень изоляции, которую имеет MAF, отсутствует в MEF. Это две разные структуры для двух разных вещей.

person Danielg    schedule 08.05.2009
comment
Одна маленькая вещь: помните, что «отдельный домен приложения» НЕ поможет вам, если ваш аддон выйдет из строя на собственном уровне, для этого вам все равно потребуются рабочие процессы. MAF в некоторой степени помогает с их созданием, но динамическое восстановление после такого сбоя все еще довольно сложно (но возможно). - person quetzalcoatl; 05.05.2012
comment
@Ian: пожалуйста, перечитайте мой комментарий :) Я написал именно это, и БОЛЬШЕ: MAF действительно позволяет это, но вы должны встать после сбоя в одиночку. - person quetzalcoatl; 02.04.2013
comment
@DanielG ›за это приходится платить за пересечение доменов приложений‹ Почему это так? Как тяжело'? - person Martin Meeser; 10.09.2014
comment
@MartinMeeser При пересечении доменов приложений вы должны сериализовать все или использовать объект MarshalByRef. Связь намного сложнее, чем разговор между объектами в одном домене приложения. - person Danielg; 17.09.2014

То, что сказал Дэниел, хорошо. Я бы добавил:

Если вы посмотрите видео о System.Addins, они явно говорят об очень больших проектах. Он говорит о том, что одна команда управляет хост-приложением, другая команда управляет каждой надстройкой, а третья команда управляет контрактом и конвейером. Исходя из этого, я думаю, что System.Addins явно предназначен для более крупных приложений. Я думаю о приложениях, таких как системы ERP, например SAP (может быть, не такие уж большие, но вы поняли). Если вы смотрели эти видео, то можете сказать, что объем работы по использованию System.Addins очень велик. Это было бы хорошо, если бы у вас было много компаний, разрабатывающих сторонние надстройки для вашей системы, и вы не могли бы разорвать ни один из этих контрактов надстройки под страхом смерти.

С другой стороны, MEF, похоже, имеет больше общего со схемой надстроек SharpDevelop, архитектурой надстроек Eclipse или Mono.Addins. Его гораздо легче понять, чем System.Addins, и я считаю, что он намного более гибкий. Что вы теряете, так это то, что вы не получаете изоляцию AppDomain или строгие контракты на управление версиями прямо из коробки с MEF. Сильные стороны MEF в том, что вы можете структурировать все свое приложение как состав частей, чтобы вы могли поставлять свой продукт в различных конфигурациях для разных клиентов, а если клиент покупает новую функцию, вы просто перетаскиваете часть для этой функции в их установочный каталог. и приложение его видит и запускает. Это также облегчает тестирование. Вы можете создать экземпляр объекта, который хотите протестировать, и передать ему имитационные объекты для всех его зависимостей, но когда он работает как составное приложение, процесс композиции автоматически объединяет все реальные объекты вместе.

Самым важным моментом, который я хотел бы упомянуть, является то, что хотя System.Addins уже находится в структуре, я не вижу много свидетельств того, что люди его используют, но MEF просто сидит на CodePlex, предположительно, для включения в .NET 4, и люди уже начинают создавать на нем множество приложений (включая меня). Я думаю, это кое-что говорит вам о двух фреймворках.

person Scott Whitlock    schedule 14.05.2009
comment
Если смотреть видео про System.Addin, какие видео? Не могли бы вы дать ссылку. Спасибо - person jimjim; 21.08.2012
comment
@Arjang - пара есть на канале 9. Попробуйте channel9.msdn.com/Blogs / DanielMoth / Managed-AddIn-Framework - person Chris Spicer; 02.01.2013

Разработав и отправив приложение MAF. Мои взгляды на MAF несколько пресыщены.

MAF - это "несвязанная" система или в худшем случае "слабосвязанная" система. MEF - это «связанная» система или, в лучшем случае, «слабосвязанная» система.

Преимущества MAF, которые мы реализовали с помощью MAF:

  1. Установка новых или обновление существующих компонентов во время работы приложения. Надстройку можно обновлять во время работы приложения, и обновления отображаются для пользователя без проблем. Для этого у вас должны быть домены приложений.

  2. Лицензирование на основе приобретенных компонентов. Мы могли контролировать, какие надстройки были загружены, с помощью роли и разрешений пользователя, а также была ли надстройка лицензирована для использования.

  3. Быстрое развитие (более быстрый вывод на рынок). Разработка надстроек идеально сочетается с методологией Agile, команда разработчиков разрабатывала по одной надстройке за раз, без необходимости также разрабатывать компонент интеграции с остальной частью приложения.

  4. Улучшенный QA (только QA по одному компоненту за раз). Затем QA может протестировать и выявить дефекты для одного бита функциональности. Тестовые примеры было проще разрабатывать и внедрять.

  5. Развертывание (добавляйте компоненты по мере их разработки и выпуска, и они «просто работают»). Развертывание сводится только к созданию надстройки и установке файла. Никаких других соображений не потребовалось!

  6. Новые компоненты работали со старыми компонентами. Надстройки, которые были разработаны на раннем этапе, продолжали работать. Новые надстройки легко вписываются в приложение

person user151112    schedule 05.08.2009
comment
Я сделал все вышеперечисленное с MEF на .NET 4, и я думаю, что это проще, чем MAF ... - person Tim; 02.06.2010
comment
@ Джим: можете ли вы удалить существующую надстройку MEF во время работы? Насколько мне известно, сборку надстройки нельзя выгрузить после загрузки, поскольку она находится в том же домене приложения. - person Scott Whitlock; 13.12.2010
comment
@Scott - +1 (могу я дать более одного?) Еще одно преимущество, не указанное здесь: вы можете изолировать права безопасности надстройки с помощью MAF, в то время как права безопасности, используемые компонентом в MEF, будут иметь те же права, что и запущенный применение. - person Doug; 19.03.2011
comment
@ScottWhitlock: вы подразумеваете, что невозможно использовать MEF с несколькими доменами приложений, что неверно. - person M.Stramm; 02.01.2013

На мой взгляд, две технологии на самом деле нацелены на очень разные варианты использования.

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

MAF предназначен для сценария, когда кто-то / группа разрабатывает платформу или хост, а другие группы добавят возможности постфактум и способом, не находящимся под контролем группы хостов. В этом сценарии необходимы более сложные механизмы для «защиты» хоста от мошеннических надстроек (или защиты надстроек друг от друга).

Третья похожая по шаблону технология - это вся схема ProviderBase. Это также позволяет заменить возможность, но на самом деле ее целью является сценарий, в котором хосту / приложению абсолютно необходима возможность, и действительно необходимо указать различные реализации через config.

person Raoul    schedule 22.05.2009

Я только что нашел эту длинную статью, в которой обсуждаются как MAF, так и MEF. http://emcpadden.wordpress.com/2008/12/07/managed-extensibility-framework-and-others/

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

Платформа управляемой расширяемости также не делает различий между хостом и надстройкой, как это делает System.AddIn. Что касается MEF, все они просто составные части.

person dthrasher    schedule 30.05.2009

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

MEF: Пример простого калькулятора с использованием частей MEF
(M расширяемость F ramework)

  • Показывает, как создать простой калькулятор с использованием технологии MEF. Не показывает как загружать внешние dll. (Но вы можете просто изменить пример, используя catalog.Catalogs.Add(new DirectoryCatalog("Plugins", "*.dll")); вместо catalog.Catalogs.Add(new AssemblyCatalog(typeof(Program).Assembly));, и извлечь код калькулятора и заключить контракт на отдельные проекты DLL.)
  • MEF не требует определенной структуры каталогов, он прост и удобен в использовании даже для небольших проектов. Он работает с атрибутами, чтобы объявлять, что экспортируется, что легко читать и понимать. Пример: [Export(typeof(IOperation))] [ExportMetadata("Symbol", '+')] class Add: IOperation { public int Operate(int left, int right) { return left + right; } }

  • MEF не занимается автоматическим управлением версиями

MAF: Простой калькулятор с Плагины MAF
версий V1 и V2 (M аннулированный A ddin F ramework)

  • Показывает, как создать калькулятор с помощью плагина V1, а затем как перейти к плагину V2 с сохранением обратной совместимости (примечание: вы можете найти версию V2 плагина здесь, ссылка в исходной статье не работает )
  • MAF enforces a specific directory structure, and it needs a lot of boilerplate code to make it work, hence I don't recommend it for small projects. Example:
    Pipeline
      AddIns
        CalcV1
        CalcV2
      AddInSideAdapters
      AddInViews
      Contracts
      HostSideAdapters
    

И MEF, и MAF включены в .NET Framework 4.x. Если вы сравните два примера, то заметите, что плагины MAF намного сложнее, чем фреймворк MEF, поэтому вам нужно хорошо подумать, когда использовать какую из этих фреймворков.

person Matt    schedule 29.10.2015

MAF и MEF могут использовать домены приложений, и оба могут загружать / выгружать dll во время выполнения. Однако я обнаружил следующие отличия: дополнительные модули MAF не связаны, компоненты MEF слабо связаны; MAF «активирует» (новый экземпляр), в то время как MEF создает экземпляры по умолчанию.

С MEF вы можете использовать Generics для создания GenericHost для любого контракта. Это означает, что загрузка / выгрузка MEF и управление компонентами могут находиться в общей библиотеке и использоваться универсально.

person JeffBramlett    schedule 27.09.2017