1

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

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

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

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

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

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

4

1 回答 1

2

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

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

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

如果您将拥有一些全局命令以及导出的菜单命令,您可能需要执行以下两件事之一:

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