我应该使用mvvm(轻)全局消息

时间:2013-07-06 06:46:56

标签: mvvm mvvm-light messaging

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

要添加到

的计时器计划

另一个代表远程计算机的集合,可以对它们执行许多操作

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

我正在考虑使用消息传递而是使用Messenger.Default.Register似乎与使用全局变量并没有那么不同(尽管在列表的每个元素上添加或运行函数可能不是您想要测试的东西)。

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

1 个答案:

答案 0 :(得分:1)

我假设你正在使用MVVM Light ...

所以:

如果你有两个全局集合,基本上你有几个单身人士,问题是如何最好地将它们集成到你的视图模型中。

我将这两件事视为服务,并将包含它们的类包装在一个接口中。所以:

public interface IRemoteComputersService
{
    void AddComputer(Computer computerToAdd);
    void RemoveComputer(Computer computerToremove);
    ReadOnlyCollection<Computer> RemoteComputers{get;}
}

接口需要重载到管理远程PC的类

在我的ViewModelLocator中,我注册了它:

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>();
    }

}

在我的ViewModel中,我将它注入viewmodel:

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

SimpleIoc将以递归方式解析视图模型的依赖关系。因为“MyViewModel”依赖于IRemoteComputersService服务,所以它将首先解析它,然后将其注入viewmodel。

因为MVVM-Light将在其容器中解析的每个项目视为默认情况下的单例,所以您可以保证SimpleIoc只能解析一个IRemoteComputersService。

这可以解决您的问题 - 以更好,可测试的方式使您的视频模型可以访问您的PC和计时器,也意味着您不需要查看Messaging。