Mef что это
Mef что этоMef что это
Купить Здесь
Результатом цикла, в моих планах, станет создание бесплатной электронной книги о MEF. Если у вас есть соображения или предложения по этому поводу — дайте мне знать в комментариях. Я надеюсь, что совместными усилиями мы можем создать отличное руководство. Эта статья составлена по материалам моих докладов про MEF на разных встречах, в том числе на конференции DevConf. Я ищу соавторов, критиков, просто людей, которые хотят помочь, в том числе с версткой документа. Введение Что такое MEF? Managed Extensibility Framework — это плод работы нескольких человек в компании Microsoft по разработке инструмента позволяющего решать задачи расширяемости приложений. Проект изначально разрабатывался под свободной лицензией MS-PL с открытым исходным кодом. MEF развивался как отдельная библиотека для. Включение MEF в стандартные библиотеки. NET — это важный шаг и признание значения этого инструмента. Назначение MEF заключается в предоставлении возможности разработчику добавить в свое приложение возможность расширения функционала в время исполнения. Крайне распространенный вариант такой задачи — создание плагинов для программы. Используя MEF вы легко можете определить точки расширения вашего кода, а сторонний разработчик столь же легко напишет для вашего приложения отдельные расширения. NET Framework в Microsoft. Множество материала по фреймворку вы можете обнаружить в блоге Глена на сайте http: Главным источником информации по фреймворку и местом, где располагаются исходные коды проекта является сайт http: Здесь вы обнаружите руководство разработчика, описание архитектуры MEF, ссылки на полезные ресурсы и обучающее видео, форумы, багтрекер. Последней версией MEF для. MEF — молодой инструмент, но несмотря на это, уже представлено множество продуктов, которые используют его. Другие примеры использования MEF: Стоит заметить, что в связи с тем, что MEF — это проект со свободной лицензией, фреймворк был успешно перенесен на Mono — альтернативную реализацию. NET с открытым исходным кодом от компании Novell. На сегодняшний момент в. Потому, когда такая задач возникала, каждый разработчик решал ее по-своему, в меру своих знаний, умений, требований задачи. Вполне очевидно, что эта ситуация приводит к созданию кода, который архитектурно или принципиально несовместим друг с другом. То есть, перейдя из одной компании в другую вы можете обнаружить совершенно иной подход в решении одной и той же задачи. Проблема MEF нацелен на преодоление этой проблемы. Достижение цели MEF — распространение единообразного подхода — позволит упростить нам разработчикам жизнь и сделать сопровождение чужого кода или написание расширений к чужим приложения значительно проще и в знакомой закономерной манере рис. Решение В идеальной перспективе, разработчик, который изучил MEF, будет способен без особых сложностей и длительного изучения архитектуры разрабатывать компоненты для всевозможных проектов на платформе. NET, написанных любыми другими компаниями или отдельными людьми. И, таким образом, MEF способен решить задачу взаимопонимания между разработчиками, предлагая общий язык общения. Основы Залог состоявшейся успешности MEF как инструмента кроется в его простоте. MEF построен всего на трех функциональных частях: Используя импорт вы характеризуете части вашего приложения как способные к расширяемости. Сторонний разработчик, используя функции экспорта, создает отдельный компонент часть, плагин , предназначенный для вашего приложения. И, в ходе выполнения, вы используете функции композиции для того чтобы соединить части импорта с частями экспорта. Рассмотрим эти этапы подробнее. Импортируемая часть Здесь определяется автоматическое свойство, тип которого определяется неким интерфейсом IPlugin. С помощью атрибута Import, который является частью инфраструктуры MEF, свойство помечается как импортируемое. Само свойство таким образом становится частью импорта, а типом части будет являться интерфейс IPlugin. Обратите внимание на параметр атрибута Import: Контактом называется уникальный идентификатор, который однозначно определяет часть иморта, часть экспорта и таким образом позволяет MEF соединить обе части в процессе композиции. Проще говоря, определяя контракт вы сообщаете некий пароль, который должна назвать часть расширения для того, чтобы присоединиться к точке импорта. Далее в этой главе контракты будут рассмотрены более подробно. Экспортируемая часть Здесь определяется некий класс FirstPlugin, который реализует интерфейс IPlugin часть импорта в предыдущей теме определена с помощью него же. Обратите внимание, параметром атрибута Export служит контракт объявленный как typeof IPlugin. Точно такой же контракт был определен в части импорта в предыдущей теме. Определение одинакового контракта при импорте и экспорте позволяет MEF находить предназначенный друг-другу части. Композиция После определения импортируемых и экспортируемых частей необходимо произвести их композицию рис. Композицией называет процесс поиска всех определенных частей MEF, их инстанцирования и присвоения экземпляров экспортируемых частей частям импорта. Иными словами, в процессе композиции плагины помеченные атрибутом экспорта подключаются к частям вашего когда, помеченными атрибутами импорта. Композиция Здесь создается экземпляр контейнера композиции контейнер — это часть инфраструктуры MEF, подробнее будет рассмотрена далее. После чего, у контейнера вызывается метод ComposeParts, параметры которого представляют собой перечисление элементов, в которых MEF должен искать части для композиции. В данном случае, this — это экземпляр текущий класса и new FirstPlugin — это инстанцированный плагин, помеченный нами в предыдущей части атрибутом Export. После вызова ComposeParts, в контейнере container будут записаны экземпляры this и FirstPlugin, а ипортируемая часть Plugin рис. Чуть далее мы рассмотрим весь процесс вместе в примере кода. Важную роль в процессе композиции играют контракты, которые позволяют указать нам какие именно части экспорта мы ожидаем в конкретной части импорта. Контракты Контракты в инфраструктуре MEF играют важную связующую роль между частями импорта и экспорта. Контракты обязательно явно или неявно определяются при импорте или экспорте частей. На самом деле инфраструктура MEF содержит несколько возможностей определение контракта при импорте Таблица 1. Варианты определения контрактов при импорте ImportAttribute Type с помощью указания передачи типа так как мы рассматривали ImportAttribute String с помощью передачи имени контракта в виде строки — в этом случае, вы должны обязательно гарантировать уникальность такой строки среди других контрактов ImportAttribute String, Type с помощью передачи как имени контракта в виде строки, так и его типа — это может оказаться полезным, когда появляется потребность создать несколько разных контрактов для одного и того же типа ImportAttribute в случае, если атрибутам импорта Import и другие не был передан тип контракта, то он будет определен автоматически на основании типа к которому этот атрибут применяется. Таким образом, вы можете опустить параметр typeof IPlugin в примере на рис. В вариантах когда имя контракта не было передано оно формируется автоматически с помощью метода GetContractName, который возвращает полное строковое определение типа включая его пространство имен. Как уже упоминалось, если не указан тип контракта, то он так же получается автоматически. Для атрибутов экспорта действуют те же правила, что и при импорте. Но при определение экспорта с помощью атрибутов Export и других важно понимать следующее поведение: Иными словами, если в примере на рис. Это означает, что если вы строите экспортируемую часть на основе базовых интерфейсов или классов, то вам необходимо явно указывать для контракта его тип. Пришло время собрать все знания данной главы и реализовать их в конкретном примере. Для демонстрации создадим проект на базе ASP. Этот интерфейс будет определять тип наших импортируемых и экспортируемых частей. Затем, в контроллере HomeController определим точку импорта: Обратите внимание, мы определили точку импорта с контрактом typeof IPlugin. Однако в этом случае, мы вполне можем опустить это определение контракта, доверив его автоматическое определение инфраструктуре MEF. Однако, автор этого текста настоятельно рекомендует указывать контракты всякий раз, как вы определяете импортируемые и экспортируемые части. Такое определение поможет вам быстрее понимать текст кода в дальнейшем. Обратите внимание, если в случае определения импорта мы могли опустить контракт, то в этом случае с экспортом, контракт мы опустить не можем, так как реализуем экспортируемую часть от интерфейса, который участвует в контракте. Если мы опустим определение контракта в этом коде, то получим исключение во время выполнение от инфраструктуры MEF, которая не сможет найти для точки импорта с контрактом typeof IPlugin подходящую экспортируемую часть. Последним нашим шагом будет написание кода композиции, который мы поместим в конструктор HomeController. После запуска полученного кода мы можем наблюдать ожидаемый результат рис. Заключение В этой главе мы познакомились с фреймворком MEF, его назначением и проблемами на решение которых он нацелен. Мы рассмотрели базовые понятия MEF и некоторые их особенности: Мы построили первый пример на базе полученной информации, который продемонстрировал работу MEF на деле. В следующей главе мы углубимся во фреймворк, рассмотрим более сложный пример с несколькими плагинами и познакомимся с понятием каталогов в MEF. Нет, у меня нет сторонних проектов, чтобы вам показать 9,6k НЛО прилетело и опубликовало эту надпись здесь. Приятный стиль изложения, и как про меня написано — сам придумывал велосипед для использования плагинов, используя рефлексию и бубен. Было бы здорово почитать еще, пишите! Если что, готов помогать в переводе, тема MEF мне знакома. Есть много статей на английском. Если что, могу помочь с архитектурой MEF. Как это все работает изнутри. Когда я был маленький и глупый ещё не знал про рефлексию и ООП, но сделать плагины уже хотелось — меня всегда интересовало, откуда компилятор узнает про тип FirstPlugin, если он вынесен в плагин и при компиляции его просто нет? А причем здесь рефлексия? Насколько я понимаю, просто сборка с плагином статически подключена к проекту. Вопрос был про то, откуда компилятор знает о FirstPlugin? Компилятор при сборке проекта не должен знать про типы его плагинов кроме общего интерфейса IPlugin, я считаю. На мой взгляд, пример не очень удачный, поскольку экземпляр FirstPlugin создаётся в том же объекте, в котором используется. Это можно было просто присвоение написать: Хотел написать то же, что и Ordos. Лишь однажды пользовался мефом и он понравился именно стандартизацией разработки. А с другой стороны, это может привести к проблемам при изменении типа свойства без соответствующего изменения определения атрибута. Думаю, следует добавить, что для начала надо добавить в References приложения сборку System. Только сегодня на работе обсуждали перевод одного из модулей с 2. Если не секрет, а у вас с чем связано то, что вы не переходите на 3. У нас десктопный продукт — не хочется просить пользователей качать 3. Мы считаем, что у многих уже есть. NET 2 и, исходя из этого, используем его. Но более-менее адекватных сравнений не делали, на сколько я знаю. Пример в ComposeParts крайне неудачный и совсем не то, что должно фигурировать в первой статье. Пробел в знаниях основ веб-разработки 16,7k Вашим пользователям не нужны пароли 39,4k Интересные публикации Хабрахабр Geektimes. Телеграм-бот для домашнего видео-наблюдения из подручных материалов. Какое у тебя лицо, социализм? Нет, у меня нет сторонних проектов, чтобы вам показать. В пирамиде Хеопса обнаружили большое помещение GT. Бойтесь шахмат, Вам навязываемых GT. R, Asterisk и платяной шкаф. Управляем состоянием в Angular при помощи Mobx. В Казани биткоины продают уже в продуктовом магазине GT. Причиной столкновения американского эсминца стал запутанный UI GT. Услуги Реклама Тарифы Контент Семинары.
Mef что это
Managed Extensibility Framework
Глава 1. Введение
Mef что это
Подход к конфигурированию MEF без использования атрибутов
Mef что это
Mef что это
Выращивание псилоцибиновых грибов
Managed Extensibility Framework (MEF)
NET 4 Framework предлагаются две технологии для написания гибких приложений, которые динамически загружают дополнения. Одной технологией является MEF Managed Extensibility Framework — управляемая платформа расширений , вторая технология, доступная, начиная с. В ней используется канал pipeline для коммуникаций между дополнением и приложением-хостом, что делает процесс разработки более сложным, но также обеспечивает разделение дополнений по разным доменам приложений или даже разным процессам. В этом отношении MEF является более простой из двух технологий. MEF состоит из частей и контейнеров, как показано на рисунке. Контейнер находит части в каталоге. Каталог находит части внутри сборки или папки. Контейнер подключает импорты к экспортам и таким образом делает части доступными приложению-хосту:. Это полная картина того, как загружаются части. Они находятся в каталоге. Каталог использует экспорты для нахождения частей. Поставщик экспорта обращается к каталогу, чтобы предложить экспорты из каталога. Множественные поставщики экспорта могут быть соединены в цепочки для настройки экспорта, например, со специальным поставщиком экспорта, который допускает только части для определенных пользователей или ролей. Контейнер использует поставщиков экспорта для подключения импортов к экспортам, и сам по себе является поставщиком экспорта. MEF состоит из трех больших категорий: Классы хостинга включают каталоги и контейнеры. Примитивные классы могут использоваться в качестве базовых классов при расширении архитектуры MEF для использования других приемов соединения экспортов и импортов. Естественно, классы, составляющие реализацию основанного на атрибутах механизма с рефлексией, такие как атрибуты Export и Import, и классы, которые представляют расширяющие методы для облегчения работы с частями, основанными на атрибутах, также являются частями MEF. Реализация MEF основана на атрибутах, с помощью которых помечаются части для экспорта и отображают их на импорты. Технология является гибкой и позволяет реализовать другие механизмы на основе использования абстрактного базового класса ComposablePart и расширяющих методов с механизмами на базе рефлексии из класса ReflectionModelServices. Эта архитектура может быть расширена для наследования классов от ComposablePart и предоставления дополнительных расширяющих методов, которые извлекают информацию из дополнений через другие механизмы. Начнем демонстрацию работы с архитектурой MEF с простого примера. Приложениехост может динамически загружать дополнения. В MEF дополнение называется частью part. Части определены, как экспорты и загружаются в контейнер, который импортирует части. Контейнер находит части с использованием каталога catalog. В каталоге перечислены части. В данном примере простое консольное приложение служит хостом, позволяющим подключать дополнения-калькуляторы из библиотеки. Чтобы обеспечить независимость хоста и дополнения-калькулятора, потребуется создать три сборки. Одна сборка SimpleContract хранит контракты, используемые и сборкой дополнения, и исполняемым хостом. Сборка дополнения SimpleCalculator реализует контракт, определенный сборкой контракта SimpleContract. Хост использует эту сборку для вызова дополнений. Метод GetOperations возвращает список всех операций, поддерживаемых дополнением-калькулятором, а с помощью метода Operate операция вызывается. Этот интерфейс гибок в том смысле, что калькулятор может поддерживать различные операции. Если бы интерфейс определял методы Add и Substract вместо гибкого метода Operate , для поддержки операций Divide и Multiply потребовалась бы новая версия интерфейса. С помощью интерфейса ICalculator, как определено в этом примере, калькулятор может предоставлять любое количество операций с любым числом операндов:. Интерфейс ICalculator использует интерфейс IOperation для возврата списка операций и их вызова. В ней содержатся только простые интерфейсы. Сборка дополнений SimpleCalculator содержит классы, реализующие интерфейсы, которые определены контрактами. Класс Operation реализует интерфейс IOperation. Этот класс содержит только два свойства, как определено в интерфейсе. Интерфейс определяет средства доступа get для свойств; внутреннее средство доступа set используется для установки свойств изнутри сборки:. Класс Calculator обеспечивает функциональность данного дополнения, реализуя интерфейс ICalculator. Класс Calculator экспортируется как часть, что определено атрибутом Export. Этот атрибут определен в пространстве имен System. Composition в одноименной сборке:. Приложение-хост является простым консольным приложением. Дополнение использует атрибут Export для определения того, что должно экспортироваться; в приложении хосте атрибут Import определяет, что им должно использоваться. Здесь атрибут Import аннотирует свойство Calculator, который устанавливает и получает объект, реализующий ICalculator. Таким образом, здесь может использоваться любое дополнение-калькулятор, которое реализует этот интерфейс:. В методе Main консольного приложения создается новый экземпляр класса Program и вызывается метод Run. В методе Run создается каталог DirectoryCatalog, инициализируемый дополнением AddInDirectory, который настроен в конфигурационном файле приложения. AddInDirectory использует свойство проекта Settings для применения строго типизированного класса с целью доступа к специальной конфигурации. Класс CompositionContainer — это репозиторий частей. Данный контейнер инициализируется DirectoryCatalog для получения частей из папки, обслуживаемой этим каталогом. ComposeParts — расширяющий метод, который расширяет класс CompositionContainer и определяется классом AttributedModelServices. Этот метод требует частей, передаваемых в аргументах атрибута Import. Поскольку класс Program имеет атрибут Import со свойством Calculator, экземпляр класса Program может быть передан в этот метод. Экспорты находятся и отображаются с помощью реализации импортов. После успешного вызова этого метода могут быть использованы экспорты, отображенные на импорты. Если не все импорты отображены на соответствующие экспорты, генерируется исключение типа ChangeRejectedException, которое записывает сообщение об ошибке и завершает метод Run. С помощью свойства Calculator могут использоваться методы из интерфейса ICalculator. Метод GetOperations вызывает методы ранее созданного дополнения и возвращает четыре операции. После опроса пользователя, какая операция должна быть вызвана, и запроса значений операндов вызывается метод дополнения Operate. Итак, вы увидели, что собой представляют импорты, экспорты и каталоги архитектуры MEF. Нашли ошибку или опечатку? Выделите текст и нажмите Поменять цветовую гамму сайта? Пройди тесты C тест легкий. Ваш браузер останется на этой же странице Отмена Отправить.
Mef что это
Мефедрон – новый дизайнерский наркотик
Mef что это
Подход к конфигурированию MEF без использования атрибутов
Mef что это
Глава 1. Введение
Mef что это