Po zrobieniu kilka projektów z wykorzystaniem wzorca MVVM, Im nadal zmaga się z rolą ViewModel:MVVM: ViewModel i Business Logic Connection
co zrobiłem w przeszłości: Korzystanie Modelu tylko jako pojemnik Danych . Wprowadzanie logiki do manipulowania danymi w ViewModel. (To prawda w logice biznesowej?) Con: Logika nie nadaje się do ponownego użycia.
Co próbuję teraz: Utrzymywanie modelu ViewModel tak cienkiego, jak to możliwe. Przenoszenie całej logiki do warstwy modelu. Tylko zachowanie logiki prezentacji w ViewModel. Con: Sprawia, że powiadomienia UI są bolesne, jeśli dane zostaną zmienione w warstwie modelu.
Więc dam wam przykład, aby uczynić go bardziej przejrzyste:
Scenariusz: Narzędzie do zmiany nazwy plików. Klasy: Plik: Reprezentowanie każdego pliku; Reguła: Zawiera logikę jak zmienić nazwę pliku;
Jeśli jestem po podejście 1: Tworzenie ViewModel dla pliku, reguły i widoku -> RenamerViewModel. Umieszczenie całej logiki w RenamerViewModel: Zawiera listę FileViewModel i RuleViewModel oraz logikę postępowania. Łatwy i szybki, ale nie nadaje się do ponownego użycia.
Jeśli będę postępować zgodnie z podejściem 2: Tworzenie nowej Klasy Modelu -> Zmień nazwę, która zawiera Listę Plików, Regułę i Kontynuującą Logikę, aby interweniować nad każdym plikiem i zastosować każdą Regułę. Tworzenie widoku dla pliku, reguły i zmiany nazwy. Teraz tylko RenamerViewModel zawiera instancję Modelu Renamer oraz dwie ObservableCollections do zawijania Listy Plików i Reguł Renamer. Ale cała Logika jest w Modelu Renamer. Tak więc, jeśli Model Renamer jest uruchamiany w celu manipulowania niektórymi wywołaniami danych przez metody, ViewModel nie ma pojęcia, które dane są manipulowane. Ponieważ model nie zawiera żadnych powiadomień PropertyChange i uniknę tego. Logika biznesowa i prezentacji jest oddzielona, ale to utrudnia powiadomienie interfejsu użytkownika.
Powiadomienie jest zawsze opisywane jako część ViewModel, dlatego chciałbym tego uniknąć w Modelu. Wydaje się, że robisz to samo dwa razy. – JDeuker
@JD .: Oczywiście, ale to albo to, albo wdrażanie usług. Twoja decyzja. – Jon
@Jon: +1 dla "nigdy tego nie rób". Deweloperzy przyzwyczajeni do modelu N-tieru zapominają, że można dodawać odniesienia do bibliotek WPF do VM, aby przekazać złożone obiekty wymagające kompozycji, takie jak FlowDocument. –