|
|
||||||||||||||||
MEF и создание расширяемого приложения24.11.2015, 15:28. Показов 10547. Ответов 39
Метки нет (Все метки)
Итак, на создание этой темы меня толкнуло желание поделиться тем немногим, что мне удалось выяснить по данной теме. Сразу скажу - я не профессионал, а в данной теме так вообще новичок(буквально вчера начал разбираться), так что если у кого-то будут какие замечания, дополнения (именно по затронутому вопросу) - буду рад выслушать.
Не секрет, что создание расширяемых и в то же время простых приложений - не простая задача. Приходится работать с доменами приложений, сборками, использовать отражение, конфигурационные файлы и прочее. И если для людей более-менее сведущих это еще по силам, то для обычных пользователей программ это задача сложна. С другой стороны, и нам, тем, кто разрабатывает подобные приложения, тоже хотелось бы избавить себя от всех проблем, связанных с созданием расширяемых приложений. Именно для таких целей и была разработана платформа MEF - Managed Extensibility Framework. Она избавляет разработчика от многих проблем и упрощает его работу. В качестве примера я покажу код классической программы - калькулятора. Однако, в отличие от тех примеров, что мне удалось найти в сети (информация по MEF довольно скупа, несколько статей, и нет ясности, выражающей суть создания приложения с плагинами), мой пример сделан именно в форме. Сделано это специально, для большей наглядности работы. И если в других случаях консоль обеспечивает лучшую наглядность, то тут, на мой взгляд, все наоборот. Структурно программа состоит из основной части - формы с обработчиками событий интерфейса, класса менеджера плагинов, инкапсулирующего в себе всю логику загрузки плагинов и предоставления имеющейся в них функциональности, и собственно плагинов - библиотек dll, реализующих общедоступный интерфейс основного приложения. Сам код менеджера плагинов прост, буквально несколько строк, однако этого вполне хватает. Достаточно создать проект библиотеки, добавить две ссылки - на основное приложение и на сборку System.ComponentModel.Composition, и в классе библиотеки реализовать общедоступный интерфейс, снабдив класс атрибутом экспорта. После этого все, что надо для подключения плагина - просто поместить готовую библиотеку в каталог приложения (или в его подкаталог, как указано в комментариях в коде), и плагин будет подключен при загрузке приложения. Аналогично, для его удаления или предоставления нового достаточно удалить/заменить файл плагина, все остальное среда выполнения сделает за нас. Весь код программы снабжен комментариями, возможно, терминология не везде точна, но это моя первая программа с использованием MEF. Ниже код, и собственно сам проект в архиве. Код основной формы:
13
|
||||||||||||||||
| 24.11.2015, 15:28 | |
|
Ответы с готовыми решениями:
39
MEF создание элементов в разных потоках MEF создание единого репозитория для запроса
|
| 24.11.2015, 16:23 | |
|
Не по теме: insite2012, для таких штук есть блоги
0
|
|
|
61 / 61 / 32
Регистрация: 30.07.2013
Сообщений: 178
|
|
| 24.11.2015, 16:37 | |
|
Не по теме:
Спасибо автору - тема очень интересная.
0
|
|
|
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
|
||||||
| 25.11.2015, 16:27 | ||||||
|
Думаю, что использование дополнительных коллекций в примере:
В данном случае надо понимать, что с помощью композиции мы ищем в каталогах сборки и создаем экземпляры классов используя интерфейс (либо же можно использовать базовый класс), загружая их в коллекцию. Так же в официальном примере, показано как использовать в данном случае атрибут ExportMetadata, который и определяет какая операция используется. Как по мне так подобные "фильтры" (иными словами трудно это назвать) все же лучше реализовывать в виде атрибутов. ЗЫ. Мне кажется что вы немного переборщили с примером, как бы развили его немножко не в том направлении. Сам по себе MEF очень интересная штука, и при ее использовании главное правильно спроектировать систему. ЗЫЫ. так же можно добавить что в качестве каталога композиции может выступать и само приложение. То есть мы можем размещать классы с атрибутами импорта в основном проекте.
0
|
||||||
|
|
|||||
| 25.11.2015, 17:41 [ТС] | |||||
![]()
0
|
|||||
|
|
||
| 25.11.2015, 21:02 [ТС] | ||
|
Я сам не пробовал (поскольку сам начал пару дней как с этой темой разбираться), но точно такая идея у меня уже была. ![]() Думаю, что да, это вполне возможно.
0
|
||
|
|
|
| 25.11.2015, 21:09 | |
|
Ну, не совсем "шкурки"
![]() некорректно выразился. Применить FlowLayuotPanel. Т.е. добавляя контролы со своими обработчиками мы как бы превращаем калькулятор в ... инженерный))) наращивая тем самым функционал + добавляя этот функционал как Control. При этом "подкидывая" всё новые и новые "кнопки" в папку.
0
|
|
|
|
||
| 25.11.2015, 21:16 [ТС] | ||
0
|
||
|
|
||
| 25.11.2015, 21:20 | ||
|
У меня был как-то опыт общения с разработчиками на предмет создания длл-ок для длл-ок))) Там всё упиралось в навороченную рефлексию. Я как тогда там мало понимал, так и сейчас.
0
|
||
|
Master of Orion
|
|
| 25.11.2015, 21:33 | |
|
skilllab, да ничего сложного, делаем интерфейс IButton со свойством Operate или что-нибудь в таком духе. После этого плагин находит все IButton и пихает их все в этот лейаут. Если уж совсем кастомизировать, то в IButton добавляется свойство Control, и этот контрол добавляется хоть в FlowLayoutPanel, Хоть куда.
0
|
|
|
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
|
|
| 25.11.2015, 22:00 | |
|
Еще есть МАF , чуть более удобен.
А вообще , хз , расплодилось столько всяких вариаций; Unity, NInject и т.п (притом в исполнении MS), сейчас под каждый фреймворк делают свою версию- у owin-а одни , у mvc - другой , для веб.форм третий , в веб.апи четвертый , к чему это я - к тому , что за всем этим лесом , MEF/MAF как то смотрится устаревшим и практически не вспоминается.
0
|
|
|
|
|
| 25.11.2015, 22:01 [ТС] | |
|
skilllab, посмотрите прикрепленный архив. Там, конечно, все коряво, сделал наспех (после вашего вопроса), но контролы передавать можно, так что пробуйте. Я там создавал GroupBox, пока там только один, и с размерами не очень, но это просто тест (после вашего вопроса решил проверить). Пробуйте, экспериментируйте.
0
|
|
|
|
||
| 25.11.2015, 22:13 [ТС] | ||
|
Если GroupBox передается, то и Button должен. 100500.
0
|
||
|
|
|
| 25.11.2015, 23:17 [ТС] | |
|
1
|
|
|
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
|
||||||
| 26.11.2015, 09:05 | ||||||
Например данный способ позволяет добавлять новый функционал не особо привязываясь к архитектуре приложения.
0
|
||||||
|
|
||
| 26.11.2015, 09:15 [ТС] | ||
|
0
|
||
|
|
|
| 26.11.2015, 09:22 | |
|
1
|
|
| 26.11.2015, 09:22 | |
|
Помогаю со студенческими работами здесь
20
Реализация Managed Extensibility Framework (MEF) MEF. Выборочная загрузка. Фильтрация модулей.
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|