Модульное (как плагин) настольное приложение - PullRequest
0 голосов
/ 09 апреля 2019

Я собираюсь создать настольное приложение, в которое можно добавлять / удалять модули, добавляя / удаляя dll (каждый модуль обрабатывается dll) или через файл конфигурации.

Моя цель - иметь приложение, подобное eclipse ide, в начале будут некоторые базовые функции (eclipse basic), затем другие функции могут быть установлены как плагины, чтобы быть полнофункциональным приложением.

Потратив немного времени на поиск, вы получите Managed Extensibility Framework (MEF) . Проблема в том, что MEF, кажется, приостановлен для поддержки в течение длительного времени, и не многие приложения используют его. Может ли кто-нибудь сказать мне, почему и я должен продолжать это? У меня есть много опыта в WinForm, но WPF.

Если есть какие-либо другие подходы, пожалуйста, дайте мне знать.

Ответы [ 4 ]

2 голосов
/ 17 апреля 2019

Если вы хотите избежать зависимости от какой-либо из платформ расширения, таких как MEF или Prism, вы также можете использовать чистое отражение с загрузкой сборки. Вот как это будет работать:

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

Вы можете узнать об этом подходе на следующих страницах документации:

Может показаться, что многому научиться, но через некоторое время это довольно просто.

1 голос
/ 15 апреля 2019

MEF - действительно хороший способ для такой архитектуры приложений. Сказать «не так много приложений используют MEF» не совсем правильно, потому что (вероятно) самым крупным и наиболее известным приложением, использующим MEF, является сама Visual Studio (начиная с версии 12.0 - 2013).

Теперь, есть некоторые недоразумения по поводу MEF. Есть 3 (ну, три с половиной) версии (вкуса) MEF. Это часто смущает людей.

Позвольте мне попытаться объяснить:

  • MEF 1.0 , также известный как .NET Framework MEF. Первоначально выпущен с .NET Framework 4.0; пространство имен System.ComponentModel.Composition.
    • плюсы : часть .NET Framework; очень гибкий и динамичный
    • минусы : (относительно) медленно; нет дальнейшего развития
  • MEF 2.0 , также известный как NuGet MEF. Microsoft хотела гораздо более быструю версию для приложений Windows Phone и не нуждалась в этом полностью динамичном подходе. Сначала выпущен только для мобильных платформ, а затем доступен для других платформ. Его можно получить через NuGet или с помощью .NET Core FX. Пространство имен System.Composition.
    • плюсы : быстро; теперь часть .NET Core FX
    • минусы : относительно «статично»; плохая производительность при запуске
  • MEF 1.0 + , иногда ошибочно именуемый MEF 2.0. Это было обновление MEF 1.0, выпущенное с .NET Framework 4.5. Плюсы и минусы см. MEF 1.0.
  • VS-MEF , особая разновидность MEF, используемая в Visual Studio. Может быть получен через NuGet ; также см. GitHub . Пространство имен Microsoft.VisualStudio.Composition.
    • плюсы : сочетает в себе хорошую производительность MEF 2.0 с почти такой же гибкостью, что и MEF 1.0; находится в стадии активной разработки
    • cons : динамическая перекомпоновка отсутствует

Эти версии MEF, конечно, имеют некоторые различия , но любая из этих версий может использоваться для динамического приложения на основе плагинов. В зависимости от ваших потребностей, вы можете выбрать один из них. В настоящее время я бы порекомендовал либо MEF 2.0 (NuGet MEF), либо VS-MEF. У меня есть практический опыт работы с VS-MEF, и я полностью удовлетворен его набором функций и производительностью.

Однако MEF - не единственный способ. Всегда есть возможность создания домашней платформы для приложений на основе плагинов. На самом деле, многие компании идут по этому пути.

Другая возможность (если у вас есть архитектура на основе IoC) - это использовать некоторый доступный контейнер IoC (например, Unity) и вручную расширять его функциональные возможности при необходимости.

1 голос
/ 15 апреля 2019

Сначала , MEF является частью .NET Framework и доступен в .NET Core.MEF жив и используется во многих проектах.Последние изменения были сделаны месяц назад для предварительного выпуска https://www.nuget.org/packages/System.Composition/1.3.0-preview3.19128.7 и, конечно, в github (см. System.Composition. *).

Второй , я согласилсяс @ мм8.Призма - это хороший выбор.Но вы можете увидеть Win Application Framework (WAF) .

Как написано в описании, WAF поддерживает:

  • WPF (Windows Presentation Foundation)
  • UWP (универсальная платформа Windows)
  • Core (базовая поддержка всех приложений на базе .NET)

См. Модульная архитектура разделдля более подробной информации о настройке модульности.WAF использует MEF под капотом.Смотрите хороший пример для настройки https://github.com/jbe2277/waf/blob/master/src/System.Waf/Samples/InformationManager/Assembler/App.xaml.cs

Часть кода с использованием MEF и WAF из примера:

// An aggregate catalog that combines multiple catalogs
var catalog = new AggregateCatalog();
// Add the WinApplicationFramework assembly to the catalog
catalog.Catalogs.Add(new AssemblyCatalog(typeof(ICustomService).Assembly));

// Load module assemblies from files *.Presentation.dll and *.Applications.dll
foreach (string moduleAssembly in GetCustomModuleAssemblies())
{
    catalog.Catalogs.Add(new AssemblyCatalog(moduleAssembly));
}

var container = new CompositionContainer(catalog, CompositionOptions.DisableSilentRejection);
var batch = new CompositionBatch();
batch.AddExportedValue(container);
container.Compose(batch);

// Initialize all presentation services
var presentationServices = container.GetExportedValues<IPresentationService>();
foreach (var presentationService in presentationServices) { presentationService.Initialize(); }

// Initialize and run all module controllers
moduleControllers = container.GetExportedValues<IModuleController>();
foreach (var moduleController in moduleControllers) { moduleController.Initialize(); }
foreach (var moduleController in moduleControllers) { moduleController.Run(); }

Третий , я советую использовать WPF или Avalonia (кроссплатформенная платформа .NET UI) для настольного интерфейса вместо WinForms.

1 голос
/ 09 апреля 2019

Вы должны взглянуть на Prism . Это платформа с открытым исходным кодом для создания слабосвязанных, поддерживаемых и тестируемых приложений XAML в WPF, Windows 10 UWP и Xamarin Forms.

Поддерживается добавление модулей с использованием конфигурации, как показано в этом примере: https://github.com/PrismLibrary/Prism-Samples-Wpf/tree/master/07-Modules%20-%20AppConfig

...