我有一个简单的数据库应用程序,用户可以在其中添加或删除人员.此外,应用程序有一个按钮“向应用程序添加新按钮”.此应用程序使用Prism框架构建.有两个模块:
> RibbonControlModule(包含三个按钮 – 添加人员,删除人员,向应用程序添加新按钮)
> PersonModule(包含添加和删除人员的逻辑)
我的要求是在运行时添加新按钮.
让我们想象一下情况.我住在华盛顿,我很满意这两个按钮(添加人和删除人).但我住在新泽西的朋友鲍勃想要添加新的按钮编辑按钮,而无需重新编译整个应用程序.也就是说,Bob在可以编辑人物的地方编写dll,然后在RibbonControlModule中单击“将新按钮添加到应用程序”.之后,EditPerson按钮出现在RibbonControl中,例如,在ContextMenu中.也许EditPerson dll会是另一个Prism模块,我不知道.
也就是说,我的要求是:
>可插拔控件
>是否可以在不进行补偿的情况下插入控制? (如浏览器中的加载项或扩展(Classic Notes for Opera)(无需重新启动浏览器即可使用加载项))
>其他程序员可以在不使用我的源代码的情况下开发他们的附加组件
>用户插入控件后,应始终将此新控件插入应用程序中.
是否可以使用WPF,MVVM和Prism?我真的很喜欢Prism并且不想否认Prism,但如果“最终证明手段合理”,我想使用其他技术.
如果有可能,那我该怎么办呢?
解决方法:
这就是MEF plugin architecture的设计目标.
简而言之,您创建了一个包含插件接口的SDK,并将其作为独立库提供给客户端.然后,客户端的插件将实现此接口,并使用MEF Export属性将其导出,然后主应用程序将导入该属性.
有点棘手的是数据模板,这通常是MVVM的关键组件.简而言之,您的插件需要将其数据模板放在资源字典中,为该字典提供自己的部分类文件,并使用MEF的[Export]属性将其导出.然后您的主应用程序需要导入这些并将它们添加到全局ResourceDictionary的’MergedDictionaries’数组中.这通常与您在单独的传递中导入的所有视图模型类分开完成.实际效果是,您的插件可以在运行时提供视图和视图模型,以及将两者绑定在一起的数据模板,并且它们都可以像将它们静态编译到原始应用程序中一样工作.这也意味着您可以为客户创建插件API,而不会暴露主应用程序的内部.
这是一个非常复杂的主题,考虑到这个问题的一般性,如果这个问题没有被标记,我会感到惊讶.如果您想了解更多详情,请告知我们,我们可以将其移至讨论页面.