【问题标题】:PRISM + MEF + MVVM -- Not sure where to really start?PRISM + MEF + MVVM -- 不知道从哪里开始?
【发布时间】:2011-06-24 06:48:57
【问题描述】:

我正在使用什么:

  • Visual Studio 2010
  • Microsoft .NET Framework 4
  • 棱镜 v4

我想弄清楚的是如何在保持 MVVM 模式的同时开始使用 Prism + MEF。当我进入 Prism Quickstarts 时,它有一个 Prism + MEF,但是项目中的 cmets 明确指出 Quickstart 示例没有实现 MVVM。我不确定要混合/匹配什么,以便我的 shell 本身遵循 MVVM(和区域)。

基本上,我想使用 MEF 能够在运行时加载程序集(模块)。而且,我想在我的 Shell 中设置区域并让 Shell 使用 MVVM(这样我就可以将数据绑定到 Shell)。网上的每个示例都是 Prism、Prism + MVVM、Prism + Unity、Silverlight 示例、Prism + MEF 等。但我找不到任何 WPF Prism + MEF + MVVM 示例或信息。我真的不知道如何设置我的引导程序等等。

一旦这部分完成,我肯定会弄清楚如何使用 MVVM 将其他控件加载到我的 shell 中。任何帮助都会很棒,尤其是直接处理这种情况的资源,与类似的东西相对(即 Prism + Unity 和没有 MEF)。谢谢!

【问题讨论】:

  • 我想你会在这里找到你需要的一切来帮助你开始:Developer's Guide to Microsoft Prism
  • 你找到MEF+Prism+MVVM的例子了吗?我也找不到,一个例子值一千个帮助文件链接。
  • @JohnC:嗯,Prism 开发人员指南很有帮助,但是没有,我没有找到任何 Prism + MEF + MVVM 的具体示例。不过,单独查看每个组件会更有意义。 Prism 是一个提供实用程序和类的框架,可帮助您编写 MVVM 应用程序。 MEF 是一个插件框架。 Prism 和 MEF 之所以能够交织在一起,是因为 Prism 是可扩展的。我还没有弄清楚如何处理区域(使用 MEF),但我发现 AggregateCatalog 是 Prism + MEF 的核心和灵魂。
  • @JohnC:MVVM 是一种设计风格,它自然与 Prism 相得益彰。问题是 Prism 提供了很多工具来帮助处理特殊的 MVVM 情况(例如,它提供了 DelagateCommand 并提供了有关如何创建 CompositeCommand 的示例)。它提供区域(我还没有完全弄清楚)。它提供了诸如 NotificationObject 等类。我确实找到了使用 MEF 将我的 ViewModel 导入我的视图并将我的视图导出到我的引导程序的方法。那里有很多来源,但不是一个大示例,而是我拼凑的许多小示例。

标签: wpf mvvm module mef prism-4


【解决方案1】:

我自己从未使用过 Prism+MEF,但在您的问题中您提到您希望能够在运行时加载模块(使用 MEF)。这是您不需要 MEF 的事情,因为 Prism 本身非常擅长做这件事。设置非常简单:

首先,通过实现Modularity.IModule 创建一个 Prism 模块。它只需要一种方法:Initialize()。在这里,您可以进行模块所需的任何设置。我通常还会扩展构造函数以注入我可能需要的任何其他接口(使用 Unity)。

然后,创建一个 ModuleCatalog 来指定您创建的模块的详细信息:

<Modularity:ModuleCatalog 
           xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
           xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
           xmlns:Modularity="clr-namespace:Microsoft.Practices.Prism.Modularity;assembly=Microsoft.Practices.Prism.Composition">
    <Modularity:ModuleInfo Ref="Your.ModuleProject.dll" 
        ModuleType="Your.ModuleProject.Module, Your.ModuleProject" 
        ModuleName="Module1" 
        InitializationMode="OnDemand" />
</Modularity>

InitializationMode 是您在需要运行时加载时要设置的值。目录可以在 Prim 引导程序中加载:

catalog = Microsoft.Practices.Prism.Modularity.ModuleCatalog.CreateFromXaml(new Uri("Modules.xaml", UriKind.RelativeOrAbsolute));

那么你需要做的就是加载你的模块,得到一个IModuleManager的引用(依赖注入,耶!)然后加载模块:

if (loadModule1)
    var myModule = moduleManager.LoadModule("Module1");

现在 Prism 已知道该模块。请记住,Prism 不支持卸载。

【讨论】:

    【解决方案2】:

    您询问的所有内容似乎都出现在 Prism 随附的示例中,您只是查看了错误的示例。

    查看 StockTrader RI 文件夹,即described here

    它有一个相当完整的实际应用示例,包含一些复杂的场景,并使用 Prism(显然)、MVVM 和 MEF 实现。

    编辑:尽管我提供的链接是针对 Prism 5 的,但示例也存在于 Prism 4.1 上。在那个版本中,文档在网上不可用(至少据我记得),而是在安装了 Prism 源代码 + 示例的 .chm 文件中提供。不过不知道 v4.0。

    【讨论】: