pet*_* k. 5 silverlight design-patterns mvvm
让我们说在我的应用程序中,有一个用户界面来表示(地理)地图.它作为一个集成到应用程序中,UserControl并具有其背后的视图模型.
现在,假设我想为我的应用程序的其他部分提供通用服务接口,以在地图上执行常见任务(缩放,平移等),而不用担心UI细节.我可以放弃直接引用viewmodel,但我很确定我会违反关注点分离原则,更不用说它会不太可测试.
所以问题很少:
在此先感谢您的帮助.
每当您需要两个视图模型进行通信(或类似的东西,例如想要在自己的视图模型之外的视图模型上调用命令的按钮)时,我发现的最佳实践是使用消息传递通道。(MVVM Light 具有 Messenger 类;Prism 和 Caliburn.Micro 都有一个 EventAggregator。)实例化命令的目标(您的地图视图模型)时,它将在消息传递通道上注册特定命令。当调用程序(例如按钮)被实例化时,它可以通过同一通道发送命令。这使您的组件保持松散耦合。可以轻松模拟来自消息传递通道的命令以进行单元测试。它还为您开辟了其他途径,例如同时打开多个地图(只需使用不同的消息传递通道或某种令牌)。
在您的情况下,我会跳过整个服务界面。当使用事件聚合器时,它并没有真正增加太多。根据代码库的大小和复杂性,您可能希望保留它,以便它描述可用于地图的命令,但只有当您有多个命令时,这才有意义。在这种情况下,服务将注册为消息传递通道上命令的端点,然后必须将这些命令转发到地图视图模型。(看到了吗?并没有增加太多,而且似乎只是让事情变得复杂。)
跳过事件。他们似乎没有添加任何东西。