2009-08-17 12 views
5

Opracowałem trochę kodu WPF opartego na MVVM i potrzebuję drobnego refaktoryzacji, ale zanim to zrobię, muszę wybrać najlepszą architekturę.Dane MVVM i pół-globalne dane

Pierwotnie zacząłem od aplikacji, która może przedstawiać kilka podobnych (ale oddzielnych) reprezentacji moich danych. Nazwijmy to RecordsViewModel, który miał odpowiadający RecordsView. W miarę upływu czasu wprowadziłem SettingsViewModel, który został przekazany konstruktorowi RecordsViewModel i opublikowany w widoczny sposób (dzięki czemu można go używać pod RecordsView). SettingsViewModel jest zarejestrowany, aby zmiany były odzwierciedlane we wszystkich moich widokach.

Teraz chcę podzielić RecordsView trochę, ponieważ teraz zawiera dwa różne widoki.

Problem mam jest:

  • nowy (RecordsMainView i RecordsAlternativeView) zarówno chcą zobaczyć ustawienia.
  • Inaczej niż wcześniejsze RecordsView, które jest programowo tworzone, te nowe widoki są tworzone z Xaml (domyślny konstruktor).

Więc moje opcje wydają się być:

  1. Spacer po modelu drzewo w górę, aby znaleźć rodzica z Ustawienia
  2. wprowadzić ustawienia do DependencyProperty na kontrolach i uczynić XAML przyłączyć się obiekt do instancja.
  3. Ustaw SettingsViewModel Singleton.

Jakieś inne, lepsze, opcje? Które uważasz za najlepsze?

Odpowiedz

3

Przekształcę logikę ustawień w usługę (ISettingsService) i użyję lokalizatora usług lub wtyczki zależności, aby uzyskać dostęp do tej usługi z dowolnego modelu widoku, który tego potrzebuje.

Usługi są doskonałe do zarządzania stanem współużytkowanym, a lokalizator usług/DI bardzo ułatwia używanie maszyn wirtualnych w celu uzyskania odniesienia do usługi. Przechowywanie stanu wspólnego w maszynie wirtualnej jest nieco zjadliwe i - jak już stwierdzono - nie jest tak naprawdę skalowalne. Dobrą zasadą może być pytanie, czy stan w VM istnieje tylko po to, aby obsługiwać odpowiedni widok, czy też inne komponenty będą wymagały dostępu do tego stanu. Jeśli to drugie, przenieś go do usługi.