我有一些全球/半全球收藏。
一个要添加到的计时器时间表
另一个代表远程计算机的集合,可以对它们执行许多操作
目前,我有一个直接引用的实例化集合。
我当时正在考虑使用消息传递,但执行 Messenger.Default.Register 似乎与使用全局变量并没有那么不同,并且不是可测试的(尽管在列表的每个元素上添加或运行函数可能不是您想要测试的东西)。
我应该在特定的视图模型上注册它并将信使传递给视图模型构造函数吗?或者完全做其他事情?
我有一些全球/半全球收藏。
一个要添加到的计时器时间表
另一个代表远程计算机的集合,可以对它们执行许多操作
目前,我有一个直接引用的实例化集合。
我当时正在考虑使用消息传递,但执行 Messenger.Default.Register 似乎与使用全局变量并没有那么不同,并且不是可测试的(尽管在列表的每个元素上添加或运行函数可能不是您想要测试的东西)。
我应该在特定的视图模型上注册它并将信使传递给视图模型构造函数吗?或者完全做其他事情?
我假设您正在使用 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 将其容器中解析的每个项目默认视为一个单例,所以您可以保证只有一个 IRemoteComputersService 被 SimpleIoc 解析。
这解决了您的问题 - 使您的 PC 和计时器以更好、可测试的方式访问您的视图模型,也意味着您不需要查看消息传递。