【问题标题】:Modular (plug-in like) desktop application模块化(插件式)桌面应用程序
【发布时间】:2019-04-09 09:23:20
【问题描述】:

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

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

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

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

【问题讨论】:

标签: c# mef modular-design


【解决方案1】:

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,一种特殊的 MEF 风格,用于 Visual Studio。可通过NuGet获取;另见GitHub。命名空间Microsoft.VisualStudio.Composition
    • 优点:结合了 MEF 2.0 的良好性能和几乎与 MEF 1.0 相同的灵活性;正在积极开发中
    • 缺点:没有动态重组

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

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

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

【讨论】:

  • 非常有帮助的解释,你救了我的命。
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

    首先,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 Presentation Foundation)
    • UWP(通用 Windows 平台)
    • Core(对所有基于 .NET 的应用程序的基本支持)

    有关模块化配置的更多详细信息,请参阅Modular Architecture 部分。 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(); }
    

    第三,我建议桌面 UI 使用 WPF 或 Avalonia(跨平台 .NET UI 框架)而不是 WinForms。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 谢谢。我确实找到了这个框架,但正如我之前提到的,我没有 WPF 经验,所以我更喜欢 MEF。
      • MEF 和 WPF 完全不相关。
      • @CRAGIN:是的,我知道。我的意思是 Prism 与 WPF 一起使用
      • @TuTran:你的问题到底是什么?
      猜你喜欢
      • 2010-10-24
      • 2014-02-15
      • 2015-02-20
      • 2011-11-28
      • 1970-01-01
      • 2012-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多