(一)RI架构分析
StockTraderRI是Prism中自带的一个简易的股票模拟系统。这里我们只讨论它的WPF版本。截图如下:
让我们根据之前学习的Prism框架来进行分析,这个系统在结构上是由4个Module组成的,它们都位于下图的Module文件夹中,分别名为Market、News、Position和Watch:
我们可以从StockTraderRI项目的StockTraderRIBootstrapper类的GetModuleCatalog方法中看到这4个Module之间的依赖关系:
protected override IModuleCatalog GetModuleCatalog() { var catalog = new ModuleCatalog(); catalog.AddModule(typeof(MarketModule)) .AddModule(typeof(PositionModule), "MarketModule") .AddModule(typeof(WatchModule)) .AddModule(typeof(NewsModule)); return catalog; }
(其他几个项目——StockTraderRI.Infrastructure是4个Module都要使用的公共类库,非常重要,我们后面会对其逐步介绍;而StockTraderRI.ChartControls则是包括了各种图表的控件库,与Prism框架是无关的,于是我在自己的实现中只是添加了对这个dll的引用,而没有任何源码实现,也不对其代码进行分析)。
让我们沿着Module这条线索继续探究下去,去发现每个Module中的View与Region的对应关系。要知道,Module只是“银枪蜡鼠头”,具体的界面是由Module中所包括的若干小的View来完成的,而Region则是承载一个或多个View的容器。
从大处着眼,StockTraderRI是由4个Region组成的,如下图所示:
这4个Region都定义在StockTraderRI.Infrastructure项目的枚举RegionNames中:
public static class RegionNames { public const string MainToolBarRegion = "MainToolBarRegion"; public const string MainRegion = "MainRegion"; public const string OrdersRegion = "OrdersRegion"; public const string SecondaryRegion = "SecondaryRegion"; public const string ActionRegion = "ActionRegion"; public const string ResearchRegion = "ResearchRegion"; }
注意到,枚举中多了2个Region,分别是OrdersRegion和SecondaryRegion。这里牵扯到了Composite View的技术。
在ActionRegion中,承载了OrdersView,而就在这个xaml中,嵌套了OrdersRegion,而OrdersRegion则承载了OrderCompositeView。如下图所示。
在Shell这个View中,有一行声明引用:
infBehaviors:RegionPopupBehaviors.CreatePopupRegionWithName="{x:Static inf:RegionNames.SecondaryRegion}"
就是说,在SecondaryRegion中,承载了NewsReader这个View,这是用来在点击新闻连接时弹出新窗体的。关于这个细节技术,我们等到了News这个Module以后再讨论。
那么,相应地又有多少View呢?我试着统计了一下,共计4大类11个,列举如下:
1.其中6个View对应于下图:
View |
被哪个Region承载 |
所在Module |
TrendLineView |
ResearchRegion |
Market |
ArticleView |
ResearchRegion |
News |
OrdersView |
ActionRegion |
Position |
PositionPieChartView |
ResearchRegion |
Position |
PositionSummaryView |
MainRegion |
Position |
AddWatchView |
MainToolBarRegion |
Watch |
2.上面图中的OrdersView么?它是由3个View复合而成的,列举如上。
View |
被哪个Region承载 |
所在Module |
描述 |
OrderCompositeView |
OrdersView中的OrdersRegion |
Position |
|
OrderCommandsView |
内含在OrderCompositeView中 |
Position |
Submit/Cancel按钮 |
OrderDetailsView |
内含在OrderCompositeView中 |
Position |
Bug/Sell |
3.NewsReader是在点击ArticleView时弹出的,如下图所示。
View |
被哪个Region承载 |
所在Module |
NewsReader |
SecondaryRegion |
News |
4. WatchListView是在AddWatchView中输入股票号后展示的,如下图所示。
View |
被哪个Region承载 |
所在Module |
WatchListView |
MainRegion |
Watch |