我应该使用mvvm(轻型)全局消息传递吗

我应该使用mvvm(轻型)全局消息传递吗,mvvm,mvvm-light,messaging,Mvvm,Mvvm Light,Messaging,我有一些全球/半全球收藏 一个是要添加到的计时器时间表 另一个是表示远程计算机的集合,可以在这些计算机上执行许多操作 目前我有一个直接引用的实例化集合 我想改为使用消息传递,但使用Messenger.Default.Register似乎与使用globals没有太大区别,也没有那么可测试(尽管在列表的每个元素上添加或运行函数可能不是您想要测试的) 我应该在特定的viewmodel上注册它,并将messenger传递给viewmodel构造函数吗?或者完全做其他事情?我假设您使用的是MVVM Lig

我有一些全球/半全球收藏

一个是要添加到的计时器时间表

另一个是表示远程计算机的集合,可以在这些计算机上执行许多操作

目前我有一个直接引用的实例化集合

我想改为使用消息传递,但使用Messenger.Default.Register似乎与使用globals没有太大区别,也没有那么可测试(尽管在列表的每个元素上添加或运行函数可能不是您想要测试的)


我应该在特定的viewmodel上注册它,并将messenger传递给viewmodel构造函数吗?或者完全做其他事情?

我假设您使用的是MVVM Light

因此:

如果您有两个全局集合,那么基本上您就有两个单例,问题是如何最好地将它们集成到您的viewmodels中

我会将这两个东西都视为服务,并将保存它们的类包装在一个接口中。因此:

public interface IRemoteComputersService
{
    void AddComputer(Computer computerToAdd);
    void RemoveComputer(Computer computerToremove);
    ReadOnlyCollection<Computer> RemoteComputers{get;}
}
在引擎盖下,SimpleIoc将递归地解析viewmodel的依赖关系。因为“MyViewModel”依赖于IRemoteComputersService服务,所以它将首先解决此问题,然后将其注入viewmodel

由于MVVM Light默认情况下将在其容器中解析的每个项视为一个单例,因此可以保证SimpleIoc只解析一个iRemoteComputers服务

这就解决了您的问题——以一种更好、可测试的方式让您的viewmodels可以访问您的PC和计时器,也意味着您不需要查看消息

public ViewModelLocator()
    {
        ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

        if (ViewModelBase.IsInDesignModeStatic)
        {
            SimpleIoc.Default.Register<IDataService, Design.DesignDataService>();
        }
        else
        {
            SimpleIoc.Default.Register<IRemoteComputersService,RemoteComputersService>();
            SimpleIoc.Default.Register<IDataService, DataService>();         
        }
        SimpleIoc.Default.Register<MyViewModel>();
        SimpleIoc.Default.Register<MainViewModel>();
    }

}
public class MyViewModel:ViewModelBase, IMyViewModel
{
    public MyViewModel(IRemoteComputersService remoteComputerService)
    {
        _remoteComputerService=remoteComputerService;
    }
}