MVVM: кеширование данных для ViewModels - PullRequest
2 голосов
/ 07 декабря 2010

В моем приложении WPF MVVM я использую контейнер внедрения зависимости.Когда я хочу получить некоторые данные из моей модели, я использую асинхронный интерфейс для запроса модели и заполнения ObservableCollection в моей модели представления (я понял это благодаря ответам на мой предыдущий вопрос ).

Я ищу лучшее решение для следующей ситуации.Существует коллекция объектов, которые я извлекаю асинхронно из моей модели.Я хочу использовать одни и те же данные для создания наблюдаемых коллекций в двух разных моделях представления, так как я хочу отображать эти данные в двух разных окнах.Доменные объекты Model будут обернуты в разные объекты ViewModel, поскольку обертки должны подготовить объекты домена к отображению.Я не хочу получать данные из Модели отдельно в каждой ViewModel, но сделать это один раз, поскольку это может занять много времени.

Я видел несколько примеров и везде один ViewModelотвечает за получение данных из службы модели.Что я должен сделать, чтобы использовать когда-то извлеченные данные в нескольких ViewModel?

Я думаю, что мне следует ввести еще один уровень абстракции между моими Model и ViewModel, который будет обрабатывать кэширование извлеченных данных и каждую ViewModel, которая желаетиспользование этих данных будет зависеть от этого слоя.

Это хорошая идея?

Ответы [ 3 ]

2 голосов
/ 07 декабря 2010

Эта недостающая ссылка будет службой, на которую ссылается 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 ViewModels использовать данные из центрального расположения без ненужной загрузки.

0 голосов
/ 10 января 2016

Использовать RegionManager ["nameRegion"]. Context, ViewModel - это контекст View, которым вы можете поделиться с другими ViewModels

0 голосов
/ 07 декабря 2010

Да, вы должны ввести другой уровень, независимо от того, кэшируется он или нет в моих приложениях. ViewModels используются исключительно для привязки к представлениям и не содержат никакой логики получения данных из уровня Business (Service)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...