【问题标题】:How do I expose module capabilities in an MEF based modular application?如何在基于 MEF 的模块化应用程序中公开模块功能?
【发布时间】:2013-08-27 13:12:04
【问题描述】:

根据Create composite modular UI application in WPF using MEF and PRISM 文章的指导,我正在构建一个小型、简单(目前)的模块化应用程序。到目前为止,我有一个主窗口,有两个区域、一个 Bootstrapper 类和两个模块项目 ModuleA 和 ModuleC,它们只导出它们自己。他们还各自在主窗口的一个区域中放置一个视图(UserControl),例如:

[ModuleExport(typeof(ModuleC))]
public class ModuleC: IModule
{
    public void Initialize()
    {
        IRegionManager regionManager = (IRegionManager)ServiceLocator.Current.GetInstance(typeof(IRegionManager));
        regionManager.Regions["Region2"].Add(new MoneyUserControl());
    }
}

我的愿景是在MainWindow 中拥有一个较大的 UI 区域,供当前正在使用的高级应用功能使用,并且该功能是一个导入模块。虽然这些模块有很多共同点,并且目前是单体应用程序的一部分,但我一直在努力争取基本上只是一个提供基本服务的框架 (MainWindow),而应用程序的每个功能都作为一个模块导入。

我希望活动模块向主窗口提供菜单项(命令)。我很容易“手动”执行此操作,例如一个IModuleWithMenu接口,并在主窗口查询并集成菜单,或主窗口上的'IMenuHost`接口,并让模块将其菜单命令推入。

但是,我不禁想到必须有更好的方法,因为我已经在使用 MEF,并且有已加载模块的导出和导入目录。当然,我可以查询导出并过滤那些命令,并将它们连接到菜单或其他形式的命令调用,但 MEF 不提供类似的东西已经制作或关闭,我将自己的代码保持在一个最低限度,因此存在错误的风险。

作为一个额外的问题:是否有人拥有关于使用 MEF 构建复合应用程序的非常好的教程的副本或链接(主要在 WPF 中,但我可以为其他人改编 WPF),因为它应该这样做。我完成的这篇文章只是对模块、目录和 MEF 本身的一个小介绍。我想要一些非常非常技术性和深度的东西。甚至可以买书。

【问题讨论】:

    标签: .net wpf prism mef extensibility


    【解决方案1】:

    虽然我不知道有关创建 MEF WPF Prism 应用程序的任何教程,但我目前正在开发许多此类应用程序以供工作,因此我可以提供一些我使用的技巧。

    我要说的第一件事是,既然您使用的是 MEF,那么您应该使用它。您不需要使用ServiceLocator。导入IRegionManager!与 Prism 中的其他 IoC 容器相比,我真正喜欢 MEF 的另一件事是,我通常不编写 IModule 实现。您的模块没有定义导出,因为这是使用属性处理的。我创建了一个自定义Attribute 来将View 导出到Region,并创建了一个基础架构IModule,它将这些视图注册到它们的区域。

    要将Menu 添加到您的应用程序中,我认为最好的方法是将Menu 导出为单独的View。然后你会有一个Region,它只是一个ContentControl,名称类似于MenuRegion。如果您有多个注册了Menu 的视图,它们可以在主视图更改时在菜单区域上调用IRegionManager.NavigateToView。当然,您可以使用接口(或者可能是您用来装饰主视图的属性)来使这部分成为您的基础架构,这样各个视图就不必重写相同的代码。

    如果您要使用一些全局命令以及导出的菜单命令,您可能需要做以下两件事之一:

    • 创建自定义IRegionAdapter 来管理如何添加菜单项。在这种情况下,我建议您导出顶级 MenuItem 对象。您还可以将单个 MenuItems 定义为区域。就像FileMenuRegion 一样,它允许您将MenuItems 添加到File 菜单中。
    • 导出带有名称的ICommand,并在处理如何添加命令的特殊MainMenu ViewModel 中导出ImportMany。这可能有点复杂,因为您需要找出一种创建菜单层次结构的方法。您可能需要一些新界面,它可以比 ICommand 更全面地描述菜单。

    【讨论】:

    • 感谢您的好回答。它引导我进行更多的阅读和学习。
    猜你喜欢
    • 1970-01-01
    • 2013-12-13
    • 2021-12-17
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多