(三)RI中的数据关系
RI中的数据都是基于XML的,散落在以下几个地方:
StockTraderRI.Modules.Market模块:/Data:Market.xml和MarketHistory.xml
StockTraderRI.Modules.News模块:/Data:News.xml
StockTraderRI.Modules.Position模块:/Data:AccountPositions.xml
我将其转换为DB中的同名表,它们之间的关系如下所示:
注意到,以AccountPositions表为核心,通过TickerSymbol字段进行外键连接,AccountPositions和Market表之间是1对1的关系;而和MarketHistory、News表之间都是1对多的关系。
让我们回到程序中,再观察一下Shell主程序中的模块加载顺序(同时参照下图):
protected override IModuleCatalog GetModuleCatalog() { var catalog = new ModuleCatalog(); catalog.AddModule(typeof(MarketModule)) .AddModule(typeof(PositionModule), "MarketModule") .AddModule(typeof(WatchModule)) .AddModule(typeof(NewsModule)); return catalog; }
就是说,MarketModule的加载先于PositionModule。这是因为,在程序运行时,先加载PositionSummaryView这个GridView是毋庸置疑的,但是默认会选中其中的第一笔数据,那么在TrendLineView中必须有相对应的一笔数据显示出来,所以,MarketModule(也就是TrendLineView)的加载要先于PositionModule。
一般而言,如果RI是由一个人完成的,那么他会根据用户操作的顺序来实现,那么第一个要完成的应该是Position模块的PositionSummaryView和PositionPieChartView(毕竟是用户最先看到的GridView,并根据这些数据进一步进行操作)。
但是,如果我也按照这样的顺序来一边写一边向大家介绍RI,就展示不出Prism的优点了,即各个Team可以独自开发不同的模块,然后再无缝整合在一起。因此,在接下来的几章中,我会按照MarketàPositionàWatchàNews的顺序来逐一介绍并添加模块,并在Market完成后,介绍Prism下单元测试的具体操作。