在我的WPF MVVM应用程序中,我使用依赖注入容器。当我想从我的模型中检索一些数据时,我使用异步接口来查询模型并在我的ViewModel中填充ObservableCollection(我理解它归功于我的previous question的答案)。
我正在寻找处理以下情况的最佳解决方案。我正在从我的模型中异步检索一组对象。我想使用相同的数据在两个不同的ViewModel中构建可观察的集合,因为我想在两个不同的窗口中显示该数据。 Model域对象将被包装在不同的ViewModel对象中,因为包装器需要准备要显示的域对象。我不想在每个ViewModel中单独从模型中检索数据,而是要执行一次,因为这可能是一项耗时的操作。
我见过几个例子,到处都是一个ViewModel负责从Model服务中检索数据。如何在多个ViewModel中使用一次检索的数据?
我认为我应该在我的Model和ViewModels之间引入另一层抽象,它将处理检索到的数据的缓存,并且希望利用这些数据的每个ViewModel将依赖于该层。
这是个好主意吗?
答案 0 :(得分:2)
缺少的链接将是Prism中引用的服务。
通常使用模型类 与服务或 封装数据的存储库 访问和缓存。
您将在上一个问题中注意到我正在使用该ViewModel中的服务。
public ScriptRepositoryViewModel(IUnityContainer container,
IScriptService scriptService, IEventAggregator eventAggregator)
{
_container = container;
_scriptService = scriptService;
_eventAggregator = eventAggregator;
}
public ICollectionView Scripts
{
get
{
if (_view == null)
{
_view = CollectionViewSource.GetDefaultView(
_scriptService.Scripts);
_view.Filter = Filter;
}
return _view;
}
}
请注意IScriptService
注入ScriptRepositoryViewModel
。该服务实际上实现了缓存和变化的逻辑,以便轮询Scripts
的人将获得缓存副本或者可能是新副本;消费者不需要关心。
在您的两个ViewModel需要相同数据的实例中,您可以遵循将注释服务注入每个ViewModel的相同模式。当ViewModel调用服务来检索数据时,您可以实现逻辑,以便不从后端获取数据,除非它已经过时10分钟或者您想要的任何行为。它已被抽象出来,你可以自由地做你需要的事情;允许N个ViewModel在不需要加载的情况下从中央位置使用数据。
答案 1 :(得分:0)
是的,您必须引入另一个层,无论是否在我的应用程序中进行缓存ViewModel仅用于绑定到Views,它们不包含从Business(Service)层检索数据的任何逻辑
答案 2 :(得分:0)
使用RegionManager [" nameRegion"]。context,ViewModel是View的上下文,你可以与其他ViewModels共享