2010-04-27 12 views
12

Używam architektury S # arp i nie pamiętam, gdzie ją czytałem, ale mówią, że ViewModels powinny być przechowywane w warstwie usługi, a twoje widoki powinny przesłać viewmodel do usługi w celu przetworzenia.Która warstwa powinna utworzyć model widoku?

Moje pytanie to jest to. Która warstwa powinna zbudować ViewModel? Czy powinien znajdować się w warstwie serwisowej, a kontroler go żąda? A może sam kontroler powinien to zbudować? Pojawia się również pytanie o aktualizację modelu widoku, tak jakby zawierało kolekcje, a stan modelu jest nieprawidłowy, konieczne będzie również ponowne utworzenie listy.

Wszelkie sugestie?

Dziękujemy

Matt

Odpowiedz

8

tworzę zobacz modele wewnątrz kontrolerów. Kontrolery pobierają elementy domeny (pobierane z bazy danych za pomocą narzędzi do modelowania), ewentualnie w innych modelach widoku, repozytoria kontaktów w celu uzyskania dodatkowych danych, tworzą nowy model widoku i przekazują go do odpowiedniego widoku (lub przekierowania). Odpowiedzialność kontrolerów polega więc na przygotowaniu widoku/podglądu danych zgodnie z danymi wejściowymi domeny (i oczywiście oczywiście z obsługą błędów).

Można szukać here jako alternatywę dla tworzenia modeli widoku w kontrolerze. Technika ta przenosi tworzenie modelu widoku poza działania, dzięki czemu nie tylko akcje kontrolerów akceptują czyste obiekty domenowe, ale także zwracają czyste obiekty domenowe. Nie powiedziałbym, że jest to właściwe we wszystkich przypadkach, ale jest to bardzo interesujące.

Powyższa technika, związana z AutoMapper, również podniosła pytania podobne do "czy powinienem przekazać viewmodels do warstwy serwisowej". Nie, nie. Jeśli chcesz przekazać obiekt złożony do usługi lub warstwy domeny, zdefiniuj ten obiekt w odpowiedniej warstwie usługi/domeny i używaj go do przekazywania danych do tych warstw. Obiekt ten można następnie łatwo zmapować do modeli/z widoku (na przykład za pomocą AutoMappera). Ale twoich niższych warstw (usługa/domena) nie należy łączyć z wyższymi warstwami (widok/kontrolery). Nie w tym przypadku, nie w innych. Nigdy warstwy niskiego poziomu nie powinny zależeć od czegoś zdefiniowanego powyżej.

+0

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. –

+0

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? –

+0

Bez oglądania edytowanego widoku i modeli trudno jest odpowiedzieć. – queen3

3

Te artykuły mogą być interesujące dla ciebie:

DDD : Command Query Separation as an Architectural Concept

Better Application Services and CQS using S#arp Architecture

Jest przykładowa aplikacja związana z 2 artykułu, który ma widok i formularzy modeli w warstwie usług, zamiast kontroler.

+1

To jest poprawna odpowiedź. Zazwyczaj jednak zaczynam od ViewModel w kontrolerze i migruję go do warstwy usługi, gdy kontroler ewoluuje. –

+0

Linki są ułożone w miejscu, być może http://sharp-architecture.readthedocs.io/en/latest/additional-resources/additional-information.html pomoże? – kristianp

0

Zobacz także Who Can Help Me - to jest fantastyczne. ten framework jest oparty na architekturze S # arp. ma wiele wskazówek dla View/Form/Edit viewModels między innymi.

11

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)

Powiązane problemy