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


162

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

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

Ответы:


131

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

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

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


5
одна маленькая вещь: пожалуйста, помните, что «отдельный домен приложения» НЕ поможет вам, если ваше дополнение будет аварийно завершено в нативном слое, для этого вам все равно понадобятся рабочие процессы. MAF несколько помогает в их создании, но динамическое восстановление после такого сбоя все еще довольно сложно (но возможно)
quetzalcoatl

@Ian: пожалуйста, перечитайте мой комментарий :) Я написал именно это, и БОЛЬШЕ: MAF действительно позволяет это, но вы должны встать после аварии самостоятельно.
Кетцалькоатль

@DanielG> это связано с высокой ценой, которую вы должны заплатить за пересечение доменов приложений. <Почему это так? Как тяжело'?
Мартин Мизер

2
@MartinMeeser При пересечении доменов приложения вы должны все сериализовать или использовать объект MarshalByRef. Связь намного сложнее, чем общение между объектами в одном домене приложения.
Даниэль

65

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

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

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

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


1
"Если вы смотрите видео о System.Addin", какие видео? Не могли бы вы дать ссылку. Спасибо
Джимжим

1
@Arjang - есть пара на 9 канале. Попробуйте channel9.msdn.com/Blogs/DanielMoth/Managed-AddIn-Framework
Крис Спайсер

60

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

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

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

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

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

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

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

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

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


3
Я сделал все вышеперечисленное с MEF для .NET 4, и я думаю, что это проще, чем MAF ...
Тим

21
@Jim: вы можете удалить существующую надстройку MEF во время работы? Насколько я знаю, сборка надстройки не может быть выгружена после загрузки, так как она находится в том же AppDomain.
Скотт Уитлок

6
@Scott - +1 (могу ли я дать более одного?) Еще одно преимущество, не перечисленное здесь: вы можете изолировать защитные права надстройки с помощью MAF, в то время как права безопасности, используемые компонентом в MEF, будут иметь те же права, что и работающий применение.
Даг

2
@ScottWhitlock: Вы подразумеваете, что невозможно использовать MEF с несколькими доменами приложений, что не соответствует действительности.
М.Страмм

25

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

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

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

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


18

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

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

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


9

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

MEF: Простой пример калькулятора с помощью MEF частей
( М anaged Х xtensibility Р 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 автоматически не работает с версиями

МАФ: Простой калькулятор с V1 и V2 версии плагинов MAF
( М anaged A ddin F ramework)

  • Показывает, как создать калькулятор с помощью плагина V1, а затем перейти к плагину V2 при сохранении обратной совместимости ( примечание: вы можете найти версию плагина V2 здесь , ссылка в оригинальной статье не работает)
  • MAF обеспечивает особую структуру каталогов, и для ее работы требуется много стандартного кода, поэтому я не рекомендую его для небольших проектов. Пример:
    Pipeline
      AddIns
        CalcV1
        CalcV2
      AddInSideAdapters
      AddInViews
      Contracts
      HostSideAdapters

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


3

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.