Czy to to samo, co „ViewModel” z wzorca projektowego Model-View-ViewModel (MVVM)
Nie.
To byłoby tak :
To ma cykle. Wujek Bob starannie unikał cykli .
Zamiast tego masz to:
Który z pewnością nie ma cykli. Ale zastanawiasz się, skąd widok wie o aktualizacji. Za chwilę do tego dojdziemy.
czy jest to prosty obiekt do przesyłania danych (DTO)?
Aby zacytować Boba z poprzedniej strony:
Jeśli chcesz, możesz użyć podstawowych struktur lub prostych obiektów do przesyłania danych. Możesz też spakować go do haszapy lub skonstruować w obiekt.
Czysta architektura p207
Tak więc, jeśli chcesz.
Ale mocno podejrzewam, że to, co cię naprawdę denerwuje, to :
To urocze małe nadużycie UML kontrastuje kierunek zależności kodu źródłowego z kierunkiem przepływu kontroli. Tutaj można znaleźć odpowiedź na twoje pytanie.
W relacji za pomocą:
przepływ kontroli idzie w tym samym kierunku co zależność kodu źródłowego.
W relacji wykonawczej:
przepływ kontroli zwykle idzie w przeciwnym kierunku niż w zależności od kodu źródłowego.
Co oznacza, że naprawdę na to patrzysz:
Powinieneś być w stanie zobaczyć, że przepływ kontroli nigdy nie dostanie się od Prezentera do Widoku.
Jak to możliwe? Co to znaczy?
Oznacza to, że widok ma własny wątek (co nie jest takie niezwykłe) lub (jak wskazuje @Euphoric) przepływ kontroli pojawia się w widoku z czegoś, co nie zostało tutaj przedstawione.
Jeśli jest to ten sam wątek, widok będzie wiedział, kiedy model widoku jest gotowy do odczytu. Ale jeśli tak jest, a widok jest graficznym interfejsem użytkownika, trudno będzie mu odmalować ekran, gdy użytkownik przesunie go, czekając na DB.
Jeśli widok ma własny wątek, wówczas ma własny przepływ kontroli. Oznacza to, że aby to zaimplementować, widok będzie musiał sondować model widoku, aby zauważyć zmiany.
Ponieważ Prezenter nie wie, że Widok istnieje, a Widok nie wie, że Prezenter istnieje, nie mogą do siebie dzwonić. Nie mogą rzucać na siebie wydarzeniami. Wszystko, co może się zdarzyć, to Prezenter zapisze w View-Model, a View przeczyta View-Model. Kiedy tylko masz na to ochotę.
Zgodnie z tym diagramem jedyną rzeczą, którą widok i prezenter udostępniają, jest znajomość modelu widoku. I to tylko struktura danych. Więc nie oczekuj, że będzie się zachowywał.
Może się to wydawać niemożliwe, ale można sprawić, że zadziała, nawet jeśli model widoku jest złożony. Jedno małe zaktualizowane pole to wszystko, co widok musiałby sondować, aby wykryć zmianę.
Teraz możesz oczywiście nalegać na użycie wzorca obserwatora lub sprawić, by jakieś ramowe rzeczy ukryły przed tobą ten problem, ale proszę zrozum, że nie musisz.
Oto trochę zabawy, którą miałem ilustrując przepływ kontroli:
Zauważ, że ilekroć widzisz przepływ idący wbrew wskazanym wcześniej kierunkom, to, co widzisz, powraca. Ta sztuczka nie pomoże nam dostać się do Widoku. No chyba, że najpierw wrócimy do czegoś, co nazywamy Kontrolerem. Lub możesz po prostu zmienić projekt , aby uzyskać dostęp do widoku. To także naprawia coś, co wygląda jak początek problemu jo-jo z Data Access i jego interfejsem.
Jedyną inną rzeczą do nauczenia się tutaj jest to, że Interoperator Przypadków Użytkowych może właściwie wywoływać rzeczy w dowolnej kolejności, o ile chce wywołać prezentera jako ostatni.