Przepraszam za to długie pytanie, brzmi to trochę jak rant, ale obiecuję, że nie! Podsumowałem moje pytania poniżej
W świecie MVC rzeczy są proste. Model ma stan, widok pokazuje model, a kontroler robi rzeczy do / z modelem (w zasadzie), kontroler nie ma stanu. Aby to zrobić , kontroler ma pewne zależności od usług sieciowych, repozytorium, partii. Kiedy tworzysz instancję kontrolera, zależy ci na dostarczeniu tych zależności, nic więcej. Wykonując akcję (metodę na kontrolerze), używasz tych zależności, aby pobrać lub zaktualizować model lub wywołać inną usługę domeny. Jeśli istnieje jakikolwiek kontekst, powiedzmy, że użytkownik chce zobaczyć szczegóły konkretnego elementu, przekazujesz identyfikator tego elementu jako parametr do działania. Nigdzie w kontrolerze nie ma odniesienia do żadnego stanu. Jak na razie dobrze.
Wpisz MVVM. Uwielbiam WPF, uwielbiam wiązanie danych. Uwielbiam frameworki, dzięki którym wiązanie danych z ViewModels jest jeszcze łatwiejsze (przy użyciu bankomatu Caliburn Micro). Wydaje mi się jednak, że na tym świecie rzeczy są mniej proste. Zróbmy ćwiczenie ponownie: Model posiada stan, widok pokazy ViewModel i ViewModel robi rzeczy do / z modelu (w zasadzie), ViewModel ma mieć stan! (wyjaśnienie; może to delegaci wszystkich właściwości do jednego lub więcej modeli, ale to oznacza, musi mieć odniesienie do modelu taki czy inny sposób, który jest stan w sobie) Aby zrobićrzeczy ViewModel ma pewne zależności od usług sieciowych, repozytorium, partii. Kiedy tworzysz ViewModel, zależy ci na dostarczeniu tych zależności, ale także na stanie. I to, panie i panowie, denerwuje mnie bez końca.
Ilekroć musisz utworzyć instancję ProductDetailsViewModel
z ProductSearchViewModel
(z którego zadzwoniłeś, ProductSearchWebService
który z kolei wrócił IEnumerable<ProductDTO>
, wszyscy nadal są ze mną?), Możesz wykonać jedną z następujących czynności:
- zadzwoń
new ProductDetailsViewModel(productDTO, _shoppingCartWebService /* dependcy */);
, to źle, wyobraź sobie 3 dodatkowe zależności, oznacza to, żeProductSearchViewModel
musisz również wziąć na siebie te zależności. Również zmiana konstruktora jest bolesna. - zadzwoń
_myInjectedProductDetailsViewModelFactory.Create().Initialize(productDTO);
, fabryka to tylko Func, są one łatwo generowane przez większość platform IoC. Myślę, że to źle, ponieważ metody Init są nieszczelną abstrakcją. Nie można również użyć słowa kluczowego tylko do odczytu dla pól ustawionych w metodzie Init. Jestem pewien, że jest kilka innych powodów. - call
_myInjectedProductDetailsViewModelAbstractFactory.Create(productDTO);
Więc ... jest to wzorzec (fabryka abstrakcyjna), który jest zwykle zalecany dla tego typu problemów. Myślałem, że to genialne, ponieważ zaspokaja moje pragnienie pisania statycznego, dopóki nie zacząłem go używać. Ilość kodu na schemacie to chyba za dużo (no wiesz, poza śmiesznymi nazwami zmiennych, z których korzystam). Dla każdego ViewModel, który potrzebuje parametrów środowiska wykonawczego, otrzymasz dwa dodatkowe pliki (interfejs fabryczny i implementacja), i musisz wpisać zależności inne niż środowisko wykonawcze, takie jak 4 dodatkowe czasy. I za każdym razem, gdy zmieniają się zależności, możesz to zmienić również w fabryce. Wydaje mi się, że nawet nie używam już pojemnika DI. (Myślę, że Castle Windsor ma na to jakieś rozwiązanie [z własnymi wadami, poprawcie mnie, jeśli się mylę]). - zrób coś z anonimowymi typami lub słownikiem. Lubię moje pisanie statyczne.
Więc tak. Mieszanie stanu i zachowania w ten sposób stwarza problem, który w ogóle nie istnieje w MVC. I wydaje mi się, że obecnie nie ma naprawdę odpowiedniego rozwiązania tego problemu. Teraz chciałbym obserwować kilka rzeczy:
- Ludzie faktycznie używają MVVM. Więc albo nie przejmują się wszystkimi powyższymi, albo mają jakieś genialne inne rozwiązanie.
- Nie znalazłem szczegółowego przykładu MVVM z WPF. Na przykład projekt próbki NDDD ogromnie pomógł mi zrozumieć niektóre koncepcje DDD. Naprawdę chciałbym, gdyby ktoś mógł skierować mnie w stronę czegoś podobnego do MVVM / WPF.
- Może źle robię MVVM i powinienem odwrócić swój projekt do góry nogami. Może wcale nie powinienem mieć tego problemu. Wiem, że inni ludzie zadawali to samo pytanie, więc myślę, że nie jestem jedyny.
Podsumowując
- Czy mam rację, stwierdzając, że fakt, że ViewModel jest punktem integracji zarówno stanu, jak i zachowania, jest przyczyną pewnych trudności z wzorzec MVVM jako całości?
- Czy używanie abstrakcyjnego wzorca fabrycznego jest jedynym / najlepszym sposobem na utworzenie modelu ViewModel w sposób statyczny?
- Czy dostępna jest coś w rodzaju szczegółowej implementacji referencyjnej?
- Czy posiadanie dużej liczby modeli ViewModels, których stan / zachowanie ma zapach projektowy?