воскресенье, 11 октября 2009 г.

Managed Extensibility Framework

Введение.

Иногда возникает желание сделать наше приложения расширяемым. Такое желание может возникнуть по массе причин, например отправлять уведомление по нескольким протоколам сразу или по одному выбранному пользователем. Но более важно то, что способы отправки сообщения могут постоянно меняться и пополняться динамически, без переконпиляции приложения.


Во втором Framework таких возможностей не предоставлялось вообще, поэтому авторам программ приходилось каждый раз "изобретать велосипед" при написании подобного приложения. В третьей c половиной редакции Framework уже появилась возможность разработки подобного программного продукта, называется это стало Managed Add-In Framework. Я оказался одним из "счастливчиков", работал с этим говном не совершенным продуктом. Предлагаемый подход в Microcoft очень не удобен и не доработан до конца. Есть ряд досадных ограничений (заведомо определенная структура катологов), также работа с исключениями совершенно не куда не годится. Да и при сапорте подукта много проблем (разложи по папкам, да не перепутай чего(!), и запусти специальную тулзу утилиту для сборки этих самых адынов). Короче, что мы им сделали плохого?!
К счастью есть альтернативное, не побоюсь этого слова, элегантное решение, это Managed Extensibility Framework.


Данное сообщение будет разделено на несколько статей, для более глубокого понимания.


Что такое Managed Extensibility Framework?

Managed Extensibility Framework (MEF) - это новая библиотека в .NET которая является основой для создания легко расширяемых и гибких приложений. При использование MEF, Ваши приложения могут сделать шаг в сторону динамической компоновки от статически компилируемых. Если Вы разрабатываете расширяемое приложение, то MEF значительно упростит реализацию решения.

К сведению: MEF в стадии разработки. Текущая версию не отображает финальную версию продукта (возможно будет меняться).


Как работает Managed Extensibility Framework?

Грубо говоря MFS ядро включает каталоги (Сatalog) и CompositionContainer. Каталоги отвечают за обнаружение дополнений, а CompositionContainer за инстенцирование и использование дополнений.

  • Первый и основной класс MEF это ComposablePart. Данный класс предоставляет один или более экспортов (Exports) и может зависть от одного или более импортов (Imports).
  • Экспорты реализуют определенный интерфейс (контракт), по которому CompositionContainer может и найти и инстенсировать импорты
  • MEF контейнер взаимодействует с каталогами (Catalogs) для обеспечения доступа в копонуемые части. Контейнер сам определяет зависимости и делает видимыми экспоры за пределами сборки.
  • ComposablePart возвращается каталогом (Catalogs) и будет являться расширением Вашего приложения. ComposablePart может зависить от каких-либо импортов или предлагать свои экспортируемые объекты.
  • По умолчанию MEF ComposablePart реализует атрибутное программирование для определения експортов и импортов. Это позволяет MEF определить какие экспорты инстенсировать в импорты.




Определения которые понадобятся в дальнейшем.

  • Компонуемая часть (Composable Parts) - компонуемая еденица внутри MEF. Компонуемая еденица предостовляет сервисы (Export) и использует другие компонуемые части (Import).
  • Контракт (Contracts) - компонуемые части не не взаимодействуют напрямую, они работают через контракты.
  • Экспорт (Export) - предоставление сервиса.
  • Импорт (Import) - использование компонуемой части.
  • Каталоги (Catalogs) - сервис для поиска компонуемых частей во время выполнения программы.
  • Контейнер (CompositionContainer) - сервис для инстенсирования компонуемых частей и управления ими.

      Newer Posts