1

我将制作一个桌面应用程序,可以通过添加/删除 dll(每个模块由 dll 处理)或通过配置文件来添加/删除模块。

我的目标是拥有一个像 eclipse ide 这样的应用程序,将有一些基本功能(eclipse basic)作为开始,然后其他功能可能作为插件安装,成为一个功能齐全的应用程序。

花费一些搜索并最终获得托管可扩展性框架(MEF)。问题是MEF似乎暂停支持很长时间,并且没有多少应用程序使用它。谁能告诉我为什么,我应该继续吗?我在 WinForm 方面有很多经验,但 WPF。

如果还有其他方法,也请告诉我。

4

4 回答 4

3

如果您想避免对任何可扩展性框架(例如 MEF 或 Prism)的依赖,您还可以在程序集加载中使用裸反射。以下是它的工作原理:

  • 将开发人员需要实现的所有接口放在一个单独的类库中并使其公开可用。
  • 扩展/插件开发人员将引用该类库并在他们的类库中实现接口(稍后将成为可安装的插件)。
  • 您的应用程序将允许安装/卸载插件(实现必要接口的类库)。
  • 您的应用程序将发现插件库中的接口实现器类,并将在适当的情况下使用它们。

您可以在以下文档页面中了解此方法:

这似乎需要学习很多东西,但一段时间后它就很简单了。

于 2019-04-17T15:46:42.460 回答
3

对于这样的应用程序架构,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 框架的一部分;非常灵活和动态
    • 缺点:(相对)慢;没有进一步发展
  • MEF 2.0,也称为 NuGet MEF。Microsoft 想要一个更快的 Windows Phone 应用程序版本,并且不需要那种完全动态的方法。最初仅针对移动平台发布,然后可用于其他框架。它可以通过NuGet或使用 .NET Core FX 获得。命名空间System.Composition
    • 优点:快;现在是 .NET Core FX 的一部分
    • 缺点:相对“静态”;启动性能差
  • MEF 1.0+,有时被错误地称为 MEF 2.0。这是与 .NET Framework 4.5 一起发布的 MEF 1.0 更新。利弊见 MEF 1.0。
  • VS-MEF,一种用于 Visual Studio 的特殊 MEF 风格。可以通过NuGet获得;另请参阅GitHub。命名空间Microsoft.VisualStudio.Composition
    • 优点:结合了 MEF 2.0 的良好性能和几乎与 MEF 1.0 相同的灵活性;正在积极开发中
    • 缺点:没有动态重组

这些 MEF 版本当然有一些差异,但是这些版本中的任何一个都可以用于基于动态插件的应用程序。根据您的需要,您可以选择其中之一。现在,我推荐 MEF 2.0 (NuGet MEF) 或 VS-MEF。我对 VS-MEF 有过实践经验,对它的功能集和性能非常满意。

但是,MEF 并不是唯一的方法。总是有一个选项可以为基于插件的应用程序创建一个本土平台。事实上,很多公司都是这样走的。

另一种可能性(如果您有基于 IoC 的架构)是使用一些可用的 IoC 容器(如 Unity)并在需要时手动扩展其功能。

于 2019-04-15T14:29:59.837 回答
2

首先,MEF 是 .NET Framework 的一部分,可在 .NET Core 中使用。MEF 是活跃的并且被用于很多项目中。最后一次更改是一个月前的预发布https://www.nuget.org/packages/System.Composition/1.3.0-preview3.19128.7,当然还有github(参见 System.Composition.*)。

其次,我同意@mm8。棱镜是一个不错的选择。但是您可能会看到Win Application Framework (WAF)

如描述中所述,WAF 支持:

  • WPF(Windows 演示基金会)
  • UWP(通用 Windows 平台)
  • 核心(对所有基于 .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 框架)用于桌面 UI 而不是 WinForms。

于 2019-04-15T15:21:03.927 回答
1

你应该看看棱镜。它是一个开源框架,用于在 WPF、Windows 10 UWP 和 Xamarin Forms 中构建松散耦合、可维护和可测试的 XAML 应用程序。

它支持使用配置添加模块,如本示例所示:https ://github.com/PrismLibrary/Prism-Samples-Wpf/tree/master/07-Modules%20-%20AppConfig

于 2019-04-09T12:10:24.270 回答