Wpf MVVM:缓存ViewModels的数据

Wpf MVVM:缓存ViewModels的数据,wpf,mvvm,dependency-injection,Wpf,Mvvm,Dependency Injection,在我的WPF MVVM应用程序中,我使用依赖项注入容器。当我想从我的模型中检索一些数据时,我使用一个异步接口来查询模型,并在我的ViewModel中填充ObservableCollection(多亏了我的答案,我才理解它) 我正在寻找一个最好的解决方案来处理以下情况。我正在从模型异步检索一组对象。我希望使用相同的数据在两个不同的ViewModel中构建可观察的集合,因为我希望在两个不同的窗口中显示该数据。模型域对象将被包装在不同的ViewModel对象中,因为包装器需要准备要显示的域对象。我不想

在我的WPF MVVM应用程序中,我使用依赖项注入容器。当我想从我的模型中检索一些数据时,我使用一个异步接口来查询模型,并在我的ViewModel中填充ObservableCollection(多亏了我的答案,我才理解它)

我正在寻找一个最好的解决方案来处理以下情况。我正在从模型异步检索一组对象。我希望使用相同的数据在两个不同的ViewModel中构建可观察的集合,因为我希望在两个不同的窗口中显示该数据。模型域对象将被包装在不同的ViewModel对象中,因为包装器需要准备要显示的域对象。我不想在每个ViewModel中分别从模型中检索数据,但只需执行一次,因为这可能是一个耗时的操作

我已经看到了一些示例,每个地方都有一个ViewModel负责从模型服务检索数据。要在多个ViewModel中使用一次检索的数据,我应该怎么做

我认为我应该在我的模型和ViewModels之间引入另一个抽象层,该抽象层将处理检索到的数据的缓存,并且希望利用该数据的每个ViewModel都将依赖于该层


这是一个好主意吗?

是的,您必须引入另一个层,无论是否在我的应用程序中缓存ViewModels仅用于绑定到视图,并且它们不包含从业务(服务)层检索数据的任何逻辑,缺少的链接将是其中引用的服务

通常使用模型类 与服务或服务相结合 封装数据的存储库 访问和缓存

您将在前面的问题中注意到,我正在使用该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
中。该服务实际上实现了缓存和不同的逻辑,这样无论谁轮询
脚本
,都将获得缓存副本,或者可能是新副本;消费者不需要在意


在您的实例中,当两个ViewModel需要相同的数据时,您可以遵循将服务注入每个ViewModel的相同模式。当ViewModel调用服务来检索数据时,您可以实现逻辑,不从后端获取数据,除非数据已过时10分钟或您希望的任何行为。在这一点上它已经被抽象了,你可以自由地做你需要的事情;允许N个ViewModels在不需要加载的情况下从一个中心位置使用数据。

使用RegionManager[“nameRegion”]。上下文,ViewModel是视图的上下文,您可以与其他ViewModels共享。

我现在已经习惯了服务,我很高兴它们提供的解耦功能。谢谢