2010-12-07 28 views
2

Dans mon application MVVM MVF, j'utilise un conteneur d'injection de dépendances. Lorsque je veux récupérer des données de mon modèle, j'utilise une interface asynchrone pour interroger le modèle et remplir ObservableCollection dans mon ViewModel (je l'ai compris grâce aux réponses à mes previous question).MVVM: Mise en cache des données pour ViewModels

Je suis à la recherche d'une meilleure solution pour gérer une situation suivante. Il y a une collection d'objets que je récupère de manière asynchrone à partir de mon modèle. Je veux utiliser les mêmes données pour construire des collections observables dans deux ViewModels différents, car je veux afficher ces données dans deux fenêtres différentes. Les objets de domaine de modèle vont être enveloppés dans différents objets ViewModel comme les wrappers doivent préparer les objets de domaine à afficher. Je ne souhaite pas extraire les données du modèle séparément dans chaque ViewModel, mais pour le faire une fois, car cela peut prendre du temps.

J'ai vu quelques exemples et partout un seul ViewModel est responsable de la récupération des données du service Model. Que dois-je faire pour utiliser les données une fois récupérées dans plus d'un ViewModel?

Je pense que je devrais introduire une autre couche d'abstraction entre mon Model et ViewModels qui gérera la mise en cache des données récupérées et chaque ViewModel qui souhaite utiliser ces données aura la dépendance à cette couche.

Est-ce une bonne idée?

Répondre

2

Ce lien manquant serait un service comme référencé dans Prism.

Les classes de modèles sont généralement utilisés conjointement avec un service ou dépôt qui encapsule les données l'accès et la mise en cache.

Vous noterez dans la question précédente que j'utilise un service dans ce 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; 
    } 

}

Notez le IScriptService étant injecté dans le ScriptRepositoryViewModel. Ce service implémente réellement la mise en cache et la logique variable de sorte que quiconque interrogera pour le Scripts obtiendra une copie cachée ou peut-être une nouvelle copie; le consommateur n'a pas besoin de s'en soucier. Dans votre exemple, avec vos deux ViewModels nécessitant les mêmes données, vous pouvez suivre le même schéma d'injection de service dans chaque ViewModel. Lorsque le ViewModel appelle le service pour extraire les données, vous pouvez implémenter la logique pour ne pas extraire les données de l'extrémité arrière, à moins qu'elles ne soient périmées depuis 10 minutes ou quel que soit le comportement souhaité. Il a été abstrait à ce moment-là et vous êtes libre de faire ce dont vous avez besoin; autoriser N ViewModels à consommer les données forment un emplacement central sans charge inutile.

+0

Je l'ai maintenant, je me habitue aux services et je suis heureux à cause du découplage qu'ils fournissent. Merci. – madbadger

0

Oui, vous devez introduire une couche, indépendamment de la mise en cache ou non dans mes applications ViewModels sont utilisées pour seul but de se lier à vues et ils ne contiennent aucune logique de récupération des données de Business (Service) Couche

0

Utilisez RegionManager [ « nameRegion »]. Contexte, le ViewModel est le contexte de la vue, que yo peut partager avec d'autres ViewModels