为WPF应用程序创建加载项

Ste*_*pUp 5 c# wpf prism mvvm

我有一个简单的数据库应用程序,用户可以在其中添加或删除人员。此外,应用程序具有按钮“向应用程序添加新按钮”。此应用程序是使用Prism框架构建的。有两个模块:

  • RibbonControlModule(包含三个按钮- ,Add Person,)Delete PersonAdd new button to application

  • PersonModule(包含添加和删除人员的逻辑)

我的要求是在运行时添加新按钮。

让我们想象一种情况。我住在华盛顿,对这两个按钮(Add PersonDelete Person)感到很满意。但是我的朋友鲍勃(Bob)居住在新泽西州,他想添加新按钮Edit Button而不重新编译整个应用程序。也就是说,鲍勃写的DLL,在那里他可以编辑的人,然后点击Add new button to applicationRibbonControlModule。之后,EditPerson按钮出现在中RibbonControl,例如ContextMenu。也许EditPersonDLL将是另一个棱镜模块,我不知道。

也就是说,我的要求是:

  • 可插拔控件
  • 是否可以在不进行重新组装的情况下插入控件?(例如浏览器中的附件或扩展名(Opera经典注解)(无需重新启动浏览器即可使用附件))
  • 其他程序员可以在不使用我的源代码的情况下开发其附件
  • 用户插入控件后,则应始终将此新控件插入应用程序。

是否可以使用WPF,MVVM和Prism?我真的很喜欢Prism,并且不想否认Prism,但是如果“最终证明手段合理”,我想使用其他技术。

如果有可能,那我该怎么办?

Mar*_*man 4

这就是MEF 插件架构的设计目的。

简而言之,您创建一个包含插件接口的 SDK,并将其作为独立库提供给您的客户。然后,您的客户端插件实现此接口并使用 MEFExport属性导出它们,然后您的主应用程序导入该属性。

有点棘手的是数据模板,它通常是 MVVM 的关键组件。长话短说,您的插件需要将其数据模板放入资源字典中,为该字典提供自己的部分类文件,并使用 MEF 的[Export]属性将其导出。然后,您的主应用程序需要导入这些并将它们添加到全局 ResourceDictionary 的“MergedDictionaries”数组中。这通常是与在单独的传递中导入的所有视图模型类分开完成的。最终效果是,您的插件可以在运行时提供视图和视图模型,以及将两者绑定在一起的数据模板,并且所有这些都将像静态编译到原始应用程序中一样工作。这还意味着您可以为客户创建插件 API,而无需暴露主应用程序的内部结构。

这是一个非常复杂的话题,考虑到这个问题的普遍性,如果这个问题没有被标记,我会感到惊讶。如果您想了解更多详细信息,请告诉我,我们可以将其移至讨论页面。