MVVM:提供服务以使用UI的特定部分?

pet*_* k. 5 silverlight design-patterns mvvm

让我们说在我的应用程序中,有一个用户界面来表示(地理)地图.它作为一个集成到应用程序中,UserControl并具有其背后的视图模型.

现在,假设我想为我的应用程序的其他部分提供通用服务接口,以在地图上执行常见任务(缩放,平移等),而不用担心UI细节.我可以放弃直接引用viewmodel,但我很确定我会违反关注点分离原则,更不用说它会不太可测试.

所以问题很少:

  1. 它是否有意义,并且首先实现这些服务(作为UI的中间链接)是一种好的做法?
  2. 由于服务直接在map的viewmodel上运行,它应该是实现服务接口的viewmodel本身吗?
  3. 是否适合服务接口提供事件(例如,除了提供更改地图比例的方法,还提供地图比例也发生变化的事件)?或者是否最好采用某种事件广播器(聚合器)机制将此类通知推送到服务接口之外?

在此先感谢您的帮助.

Mik*_*ost 1

每当您需要两个视图模型进行通信(或类似的东西,例如想要在自己的视图模型之外的视图模型上调用命令的按钮)时,我发现的最佳实践是使用消息传递通道。(MVVM Light 具有 Messenger 类;Prism 和 Caliburn.Micro 都有一个 EventAggregator。)实例化命令的目标(您的地图视图模型)时,它将在消息传递通道上注册特定命令。当调用程序(例如按钮)被实例化时,它可以通过同一通道发送命令。这使您的组件保持松散耦合。可以轻松模拟来自消息传递通道的命令以进行单元测试。它还为您开辟了其他途径,例如同时打开多个地图(只需使用不同的消息传递通道或某种令牌)。

在您的情况下,我会跳过整个服务界面。当使用事件聚合器时,它并没有真正增加太多。根据代码库的大小和复杂性,您可能希望保留它,以便它描述可用于地图的命令,但只有当您有多个命令时,这才有意义。在这种情况下,服务将注册为消息传递通道上命令的端点,然后必须将这些命令转发到地图视图模型。(看到了吗?并没有增加太多,而且似乎只是让事情变得复杂。)

跳过事件。他们似乎没有添加任何东西。