Różnice między DTO, a ViewModel we wzorcu MVC

0

Cześć,
Zacząłem uczyć się asp.net mvc 5 ale blokuje mnie coś jak nie rozumiem pewnych rzeczy jakie napotykam, tym razem jest to różnica między DTO, a ViewModel.
Z doświadczenia we wzorcu MVVM wiem co to jest ViewModel ale też już wiem, że to nie jest to samo co VM w MVC. Używając wzorca MVVM korzystałem, również z DTO. Przeszukując internet w poszukiwaniu definicji VM z wzorca MVC spotkałem się pewnym określeniem, które wręcz opisywało DTO.
Więc może mi, ktoś wyjaśnić jaka jest różnica między DTO, a VM (podkreślam, że chodzi mi o VM z wzorca MVC oraz wiem, że jest on tylko pomocniczy) oprócz samej nazwy?

Z góry dziękuję za odpowiedzi,
Pozdrawiam

1

ViewModel to po prostu DTO które transportuje dane do/z widoku w MVC.
Aczkolwiek zauważ że w aplikacji możesz mieć też DTO które chodzą pomiędzy innymi warstwami i wtedy to już nie będą ViewModele.

0

Czyli, że kwadrat (ViewModel) jest prostokątem (DTO) ale prostokąt nie jest kwadratem?

Ale teraz takie pytanie, może być przecież taki przypadek, że ViewModel będzie identyczny jak jeden z DTO i wtedy jest tylko kopiowanie kodu, a tego np. chciałbym uniknąć więc co wtedy zrobić?

0
duzy napisał(a):

Czyli, że kwadrat (ViewModel) jest prostokątem (DTO) ale prostokąt nie jest kwadratem?

dokładniej rzecz biorąc, kwadrat (ViewModel) jest prostokątem zawsze, ale NIE KAŻDY prostokąt (DTO) jest kwadratem,
w tym wypadku tylko te prostokąty(DTO) które komunikują się z widokiem są kwadratami(ViewModel)

albo dalej idąc w analogie matematyczną ViewModel to podzbiór DTO który transportuje dane z/do warstwy widoku

0

No właśnie tylko co z kopiowaniem kodu jeśli wyjdzie sytuacja taka, że jeden ViewModel jest identyczny jak jeden DTO?

1

http://stackoverflow.com/questions/12874328/domain-vs-dto-vs-viewmodel-how-and-when-to-use-them

"It's OK to pass the DTO to the view. If you need to change or enhance the DTO then create a ViewModel. A common scenario would be to add links. It's also OK for the ViewModel to reference the DTO as a complex property."

"(...) I wouldn't recommend creating a view model for the sake of creating a view model"

4

Zazwyczaj ViewModele dekoruje się różnymi atrybutami sterującymi ich sposobem wyświetlania (lub edycji, jeśli to ViewModele służące do wysyłania na serwer). DTO z kolei dekoruje się różnymi atrybutami opisującymi komunikację (np. jak serializować datę przy przesyłaniu przez sieć).
Osobiście wolałbym mieć kilka "identycznych" klas z różnymi zestawami atrybutów niż jedną, w której każda właściwość będzie miała 8 atrybutów z różnych poziomów abstrakcji.
No i ten stan, w którym ViewModel jest identyczny z DTO jest zazwyczaj dość krótki, zazwyczaj na widoku chcemy mieć więcej danych, a przesyłać jak najmniej. Jeśli nie oddzieli się tych tworów na czas to w efekcie zaczynają wyglądać jak typowe spaghetti, którego wszyscy się boją.

0

No i ten stan, w którym ViewModel jest identyczny z DTO jest zazwyczaj dość krótki, zazwyczaj na widoku chcemy mieć więcej danych, a przesyłać jak najmniej.
Nie wiem czy dobrze rozumiem ale chcesz powiedzieć, że w takim wypadku ViewModel używa się przekazania danych do widoku, a DTO kiedy z niego przesyłasz?

0

Nie, chodzi mi o to, że nawet jeśli dzisiaj ViewModel i DTO wyglądają tak samo, to jest duże prawdopodobieństwo, że to się zmieni za tydzień lub miesiąc.

0

Ok, teraz rozumiem :)
Dziękuję za odpowiedzi!

1 użytkowników online, w tym zalogowanych: 0, gości: 1