Zgodnie z tradycyjnym podejściem lub teorią, ViewModel powinien być częścią warstwy interfejsu użytkownika. Przynajmniej ta nazwa tak mówi.
Ale kiedy zaczniesz wdrażać go samodzielnie za pomocą Entity Framework, MVC, Repository itp., Wtedy zdasz sobie sprawę z czegoś innego.
Ktoś musi zmapować modele encji z ViewModels (DTO wymienione na końcu). Czy powinno to być zrobione w A) warstwie UI (przez kontrolera), czy w B) warstwie serwisowej?
Idę z Opcją B. Opcja A jest nie-nie z powodu prostego faktu, że kilka modeli encji łączy się razem tworząc ViewModel.Nie możemy przekazywać niepotrzebnych danych do warstwy interfejsu użytkownika, podczas gdy w opcji B usługa może odtwarzać dane i przekazać tylko wymagane/minimalne do warstwy interfejsu użytkownika po mapowaniu (do ViewModel).
Ale załóżmy, że idziemy z Opcją A, umieszczamy ViewModel w warstwie interfejsu użytkownika (i modelu jednostki w warstwie usługi).
Jeśli warstwa usługi musi być odwzorowana na ViewModel, warstwa usługi musi uzyskać dostęp do ViewModel w warstwie interfejsu użytkownika. Która biblioteka/projekt? Viewmodel powinien znajdować się w oddzielnym projekcie w warstwie interfejsu użytkownika, a do tego projektu musi się odnosić warstwa Service Layer. Jeśli ViewModel nie znajduje się w osobnym projekcie, to istnieje odniesienie kołowe, więc nie ma go. Wygląda na niezręczną, że warstwa usługi ma dostęp do warstwy interfejsu użytkownika, ale mimo to możemy sobie z nią poradzić.
Ale co, jeśli jest inna aplikacja interfejsu użytkownika korzystająca z tej usługi? Co zrobić, jeśli jest dostępna aplikacja mobilna? Jak różny może być ViewModel? Czy usługa ma mieć dostęp do tego samego projektu modelu widoku? czy wszystkie projekty UI będą konkurować?
Po tych rozważaniach moją odpowiedzią byłoby umieszczenie projektu Viewmodel w Warstwie usługi. Każda warstwa interfejsu musi mimo wszystko uzyskać dostęp do warstwy usługi! I może być wiele podobnych ViewModels, z których wszyscy mogą korzystać (stąd mapowanie staje się łatwiejsze dla warstwy usługi). Mapowanie odbywa się przez linq w tych dniach, co jest kolejnym plusem.
Wreszcie jest dyskusja na temat DTO. A także o adnotacji danych w ViewModels. ViewModels z adnotacjami danych nie mogą znajdować się w warstwie usług. Tak więc DTO będzie dokładną kopią ViewModel z mapowaniem jeden na jeden pomiędzy nimi (np. Z AutoMapper). Ponownie DTO nadal ma logikę potrzebną do interfejsu użytkownika (lub wielu aplikacji) i znajduje się w warstwie serwisowej. I warstwa interfejsu użytkownika ViewModel służy tylko do kopiowania danych z DTO, z dodanym do niej "zachowaniem" (np. Atrybutem).
Chociaż nie jest to bezpośrednio związane z pytaniem. 'ViewModel Façade' (viewmodel wewnątrz innego viewmodel) & 'Polecenie' wspomniane w tym musi obejrzeć channel 9 link jest również warte eksploracji (@ 11:48 zaczyna)
To prawie wszystko, co teraz robię, ale muszę coś robić źle, ponieważ wydaje mi się, że mam dużo warunkowej logiki, kiedy zwracam uwagę na model widoku z powrotem do domeny. Może muszę podzielić mój widok na mniejsze części. –
Aktualnie mam widok edycji, który jest dodawany na podstawie stanu obiektu. Czy lepiej byłoby stworzyć wiele widoków dla różnych stanów? –
Bez oglądania edytowanego widoku i modeli trudno jest odpowiedzieć. – queen3