模块化(类似于插件)的桌面应用程序

时间:2019-04-09 09:23:20

标签: c# mef modular-design

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

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

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

如果还有其他方法,也请让我知道。

4 个答案:

答案 0 :(得分:2)

如果要避免依赖于任何可扩展性框架(例如MEF或Prism),也可以在程序集加载中使用裸反射。这是它的工作方式:

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

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

学习起来似乎很多,但是过了一会儿就很简单了。

答案 1 :(得分:1)

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

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

答案 2 :(得分: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
    • pros :. NET Framework的一部分;非常灵活和动态
    • cons :(相对)慢;没有进一步的发展
  • MEF 2.0 ,也称为NuGet MEF。微软想要Windows Phone应用程序更快的版本,并且不需要那种完全动态的方法。首先仅针对移动平台发布,然后可用于其他框架。可以通过NuGet或使用.NET Core FX来获得。命名空间System.Composition
    • 优点:快速;现在是.NET Core FX的一部分
    • cons :相对“静态”;启动性能不佳
  • 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
    • pros :结合了MEF 2.0的出色性能和几乎与MEF 1.0相同的灵活性;正在积极开发中
    • 缺点:没有动态重组

这些MEF版本当然有一些differences,但是这些版本中的任何一个都可以用于基于动态插件的应用程序。根据您的需求,可以选择其中之一。如今,我建议使用MEF 2.0(NuGet MEF)或VS-MEF。我在VS-MEF方面具有实践经验,并对它的功能和性能完全满意。

但是,MEF不是唯一的方法。总有一个选项可以为基于插件的应用程序创建本地平台。实际上,许多公司都采用这种方式。

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

答案 3 :(得分:1)

首先,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平台)
  •   
  • 核心(对所有基于.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而不是WinForms使用WPF或Avalonia(跨平台.NET UI框架)。