使用WPF构建复合应用程序的模式2010-11-01 MSDN Glenn Block
本文将介绍以下内容:
复合应用程序基础知识
引导程序和模块初始化
区域和 RegionManager
视图、命令和事件 | 本文使用了以下技术:
WPF 复合应用程序指南 |
内容问题:单一应用程序复合应用程序复合应用程序指南引导程序和容器模块初始化使用引导程序模块和服务区域和 RegionManager本地作用区域视图单独的表示命令事件结束语Windows ® Presentation Foundation (WPF) 和 Silverlight™ 等技术为开发人员提供了一种简单的声明性方法,使他们可以快速轻松地开发出具有丰富用户体验的应用程序。但是,尽管这些技术有助于进一步将表示层从逻辑层中分离出来,但它们无法解决如何构建易于维护的应用程序这一老问题。对于一些较小的项目,具备一定经验的开发人员应该能够设计和构建出便于进行维护和扩展的应用程序,此要求并不过分。但是,随着移动部件的数量(以及使用这些部件的人员)的不断增加,对项目实施控制的难度开始呈指数级增长。复合应用程序是专门针对此问题提出的解决方案。在本文中,我将对复合应用程序的定义进行解释,并说明如何才能构建一个利用 WPF 功能的复合应用程序。随后,我还会为您介绍 Microsoft 模式和实施方案小组提供的全新 WPF 复合应用程序指南(以前的代号为 "Prism")。问题:单一应用程序让我们通过一个示例来了解复合应用程序的需求。Contoso Financial Investments 提供了一个应用程序用来管理股票投资组合。借助此应用程序,用户可以查看当前的投资以及与这些投资相关的新项目,还可以将新项目添加到观察列表以及执行购买/销售交易。如果将其构建成具有用户控件的传统 WPF 应用程序,首先应构建一个顶层窗口并针对上述各个功能添加用户控件。在这种情况下,您需要添加以下用户控件:PositionGrid、PositionSummary、TrendLine 和 WatchList(参见图 1)。在设计过程中,各个用户控件都通过在 XAML 中手动操作或使用设计器(如 Expression Blend™)等方式排列在主窗口中。

图 1 单一应用程序中的用户控件然后,使用 RoutedEvents、RoutedCommands 和数据绑定将所有内容连接起来。有关此主题的详细信息,请参阅 Brian Noyes 在本期撰写的文章“了解 WPF 中的路由事件和命令” (msdn.microsoft.com/magazine/cc785480)。PositionGrid 有一个相关联的 RoutedCommand 可供选择。在命令的 Execute 处理程序中,只要选择了某个位置就会发生 TickerSymbolSelected 事件。TrendLine 和 NewsReader 被连接在一起,以侦听 TickerSymbolSelected 事件并根据所选的股票代号呈现相应的内容。在这种情况下,应用程序与每个控件都紧密耦合在一起。UI 中存在大量用于协调各个部分的逻辑。控件之间还存在着相互依赖关系。由于存在这些依赖关系,因此无法通过某种简单的方法将应用程序分解成可在其中分别开发各个不同部分的窗体。虽然可以将所有用户控件都放在一个单独的程序集中以提高可维护性,但这种做法只是将问题从主应用程序转移到了控件程序集,治标不治本。在这种模型中,进行重大更改或引入新功能都非常困难。现在,让我们增加两个新业务需求以使问题变得更复杂一些。第一个需求是添加一个基金债券屏幕,当双击某个基金时它会显示有关所选基金的个人债券。第二个需求是添加一个新屏幕,显示与所选基金相关的超链接列表。由于时间有限,这些功能必须由不同的团队并行开发。每个团队都开发单独的控件:FundNotes 和 FundLinks。要将这两个控件添加到相同的控件程序集,必须将它们添加到控件项目中。更重要的是,必须将其添加到主窗体中,这意味着每个控件中对代码和 XAML 的更改都必须合并到主窗体中。此类操作可能会非常脆弱,尤其是对已有的应用程序。如何将所有更改都应用到主应用程序中?要完成此任务,您可能需要花费大量的时间在源控件中执行合并和拆分操作。如果在应用变更时出错或意外覆盖了某些内容,应用程序就会遭到破坏。补救方法是重新考虑应用程序设计。