2009-08-17 1 views
5

Ich habe einige MVVM-basierte WPF-Code entwickelt und brauche ein wenig Refactoring, aber bevor ich das tue, muss ich die beste Architektur entscheiden.MVVM-Muster und semi-globale Daten

Ich begann ursprünglich mit einer Anwendung, die mehrere ähnliche (aber separate) Darstellungen meiner Daten darstellen könnte. Nennen wir es RecordsViewModel welches eine entsprechende RecordsView hatte. Im Laufe der Zeit stellte ich eine SettingsViewModel vor, die in den Konstruktor der RecordsViewModel übertragen und sichtbar veröffentlicht wurde (so dass RecordsView verwendet werden kann). Die SettingsViewModel ist registriert, so dass Änderungen in allen meinen Ansichten widergespiegelt werden.

Jetzt möchte ich RecordsView etwas teilen, weil es jetzt zwei verschiedene Ansichten enthält.

Das Problem, das ich habe, ist:

  • die neue (RecordsMainView und RecordsAlternativeView) wollen beide Einstellungen sehen.
  • Im Gegensatz zum früheren Programm RecordsView, das programmgesteuert instanziiert wird, werden diese neuen Ansichten von Xaml (Standardkonstruktor) instanziiert.

So scheinen meine Optionen zu sein:

  1. das Tree Model Geht nach oben einen Elternteil mit einem Setting
  2. Stellen Einstellungen ein DependencyProperty auf den Kontrollen zu finden und die XAML machen verbinden die Eigenschaft auf die Beispiel.
  3. Machen SettingsViewModel ein Singleton.

Andere, bessere, Optionen? Was würdest du am besten finden?

Antwort

3

Ich würde Ihre Einstellungen Logik in einen Dienst (ISettingsService) und Service-Locator oder Dependency-Injection verwenden, um an diesen Service von welchen Ansicht Modelle benötigen es.

Die Services eignen sich hervorragend für die Verwaltung des gemeinsamen Status. Service Locator/DI macht es Ihren VMs sehr leicht, einen Verweis auf den Service zu erhalten. Das Speichern eines freigegebenen Status in einer VM ist ein bisschen hacky und - wie Sie gefunden haben - nicht wirklich skalierbar. Eine gute Faustregel könnte darin bestehen, sich zu fragen, ob der Zustand in der VM nur existiert, um die entsprechende Ansicht zu unterstützen, oder ob andere Komponenten Zugriff auf diesen Zustand benötigen. Wenn letzteres, verschiebe es in einen Dienst.