|
|
||||||||||||||||
MEF и создание расширяемого приложения24.11.2015, 15:28. Показов 10815. Ответов 39
Метки нет (Все метки)
Итак, на создание этой темы меня толкнуло желание поделиться тем немногим, что мне удалось выяснить по данной теме. Сразу скажу - я не профессионал, а в данной теме так вообще новичок(буквально вчера начал разбираться), так что если у кого-то будут какие замечания, дополнения (именно по затронутому вопросу) - буду рад выслушать.
Не секрет, что создание расширяемых и в то же время простых приложений - не простая задача. Приходится работать с доменами приложений, сборками, использовать отражение, конфигурационные файлы и прочее. И если для людей более-менее сведущих это еще по силам, то для обычных пользователей программ это задача сложна. С другой стороны, и нам, тем, кто разрабатывает подобные приложения, тоже хотелось бы избавить себя от всех проблем, связанных с созданием расширяемых приложений. Именно для таких целей и была разработана платформа MEF - Managed Extensibility Framework. Она избавляет разработчика от многих проблем и упрощает его работу. В качестве примера я покажу код классической программы - калькулятора. Однако, в отличие от тех примеров, что мне удалось найти в сети (информация по MEF довольно скупа, несколько статей, и нет ясности, выражающей суть создания приложения с плагинами), мой пример сделан именно в форме. Сделано это специально, для большей наглядности работы. И если в других случаях консоль обеспечивает лучшую наглядность, то тут, на мой взгляд, все наоборот. Структурно программа состоит из основной части - формы с обработчиками событий интерфейса, класса менеджера плагинов, инкапсулирующего в себе всю логику загрузки плагинов и предоставления имеющейся в них функциональности, и собственно плагинов - библиотек dll, реализующих общедоступный интерфейс основного приложения. Сам код менеджера плагинов прост, буквально несколько строк, однако этого вполне хватает. Достаточно создать проект библиотеки, добавить две ссылки - на основное приложение и на сборку System.ComponentModel.Composition, и в классе библиотеки реализовать общедоступный интерфейс, снабдив класс атрибутом экспорта. После этого все, что надо для подключения плагина - просто поместить готовую библиотеку в каталог приложения (или в его подкаталог, как указано в комментариях в коде), и плагин будет подключен при загрузке приложения. Аналогично, для его удаления или предоставления нового достаточно удалить/заменить файл плагина, все остальное среда выполнения сделает за нас. Весь код программы снабжен комментариями, возможно, терминология не везде точна, но это моя первая программа с использованием MEF. Ниже код, и собственно сам проект в архиве. Код основной формы:
13
|
||||||||||||||||
| 24.11.2015, 15:28 | |
|
Ответы с готовыми решениями:
39
MEF создание элементов в разных потоках MEF создание единого репозитория для запроса
|
|
|
|||||||
| 26.11.2015, 09:34 [ТС] | |||||||
![]() Это же dll, как я понимаю... И как такового использования MEF там нет, рефлексия, так ведь? Судя по этим строкам:
0
|
|||||||
|
|
||
| 26.11.2015, 09:55 [ТС] | ||
0
|
||
|
|
||
| 26.11.2015, 09:56 | ||
|
insite2012, да, рефлексия. Из обсуждения выше плюшек от MEF не разглядел.
Почитал Managed Extensibility Framework (MEF) - MSDN, попробую прикрутить.
0
|
||
|
|
||
| 26.11.2015, 10:00 [ТС] | ||
|
0
|
||
|
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
|
||||||
| 27.11.2015, 08:57 | ||||||
|
Не знаю кому как, но мне в свое время сильно упростило жизнь вызов конструктора с параметрами.
(Я не стану расписывать как пользоваться контрактами для вызова нужного конструктора, если их несколько, все это при необходимости можно найти в документации) Вот пример.
2
|
||||||
|
|
|
| 15.01.2016, 06:37 | |
|
Попробовал нконец MEF прикрутить.
Обнаружилось, что время загрузки плагинов увеличилось с 350мс до 1200мс. Чяднт?
0
|
|
|
|
||||||
| 15.01.2016, 09:40 | ||||||
|
Psilon, если это о запуске отладки, то у меня F5.
Оно не тупит, просто композиция выполняется в 3-4 раза дольше, чем то же вручную. Там коду-то - создание каталога, да выполнение композиции. И из этих 1200мс на
0
|
||||||
|
Master of Orion
|
|
| 15.01.2016, 09:59 | |
|
Rius, к сожалению MEF сам по себе достаточно тормознутая штука, которая все через рефлексию делает... Да, он пытается что-то там кэшировать и все прочее. Но свое узкоспециализированное решение на небольших задачах всегда будет лучше. Поэтому возможно и париться не стоит с его добавлением. Кстати интересно, как ручная сборка работает?
Добавлено через 2 минуты Ну и возможно стоит посмотреть в сторону юнити
0
|
|
|
|
||
| 15.01.2016, 10:03 | ||
|
Psilon, ну интересно попариться, вдруг что-то дельное в этом есть
Не зря же тему создали.Код по ссылке в посте MEF и создание расширяемого приложения
0
|
||
|
|
||
| 15.01.2016, 12:53 [ТС] | ||
)?
0
|
||
|
|
||
| 15.01.2016, 18:35 [ТС] | ||
0
|
||
| 15.01.2016, 18:35 | |
|
Помогаю со студенческими работами здесь
40
Реализация Managed Extensibility Framework (MEF) MEF. Выборочная загрузка. Фильтрация модулей.
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
[golang] Двоичная куча, min-heap
alhaos 20.05.2026
Двоичная куча
Двоичная куча — структура данных, которая всегда держит самый важный элемент наготове.
Представьте очередь к хилеру в игре, и очередь из игроков в приоритете те у кого меньше. . .
|
[golang] Breadth-First Search
alhaos 19.05.2026
BFS (Breadth-First Search) — это базовый алгоритм обхода графа в ширину, который поуровнево исследует все связанные вершины. Он начинает с выбранной точки и проверяет всех соседей, прежде чем. . .
|
[golang] Алгоритм «Хак Госпера»
alhaos 17.05.2026
Алгоритм «Хак Госпера»
Хак Госпера (Gosper's Hack) — алгоритм нахождения следующего по величине числа с тем же количеством установленных бит.
Придуман Биллом Госпером в 1970-х, опубликован в. . .
|
Рисование бинарного древа до 6-го колена на js, svg.
russiannick 17.05.2026
<svg width="335" height="240" viewBox="0 0 335 240" fill="#e5e1bb">
<style>
<!]>
</ style>
<g id="bush">
</ g>
</ svg>
function fn(){
let rost;/ / высота древа
let xx=165,yy=210,w=256;
|
|
FSharp: interface of module
DevAlt 16.05.2026
Интерфейс модуля F# позволяет управлять доступностью членов,
содержащихся в реализации модуля. По-умолчанию все члены модуля доступны:
module Foo
let x = 10
let boo () = printfn "boo"
. . .
|
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции.
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible". . .
|
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов.
import "math"
func angleClock(hour int, minutes int) float64 {
. . .
|
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo
https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html
и его же старой инструкции по установке Lazarus с gtk2. . .
|