DTO = ViewModel?

103

Saya menggunakan NHibernate untuk mempertahankan objek domain saya. Untuk menjaga hal-hal sederhana saya menggunakan proyek ASP.NET MVC sebagai lapisan presentasi saya, dan lapisan layanan saya.

Saya ingin mengembalikan objek domain saya dalam XML dari kelas pengontrol saya. Setelah membaca beberapa posting di sini di Stack Overflow saya mengumpulkan DTO adalah cara yang harus dilakukan. Namun, saya juga menemukan posting yang membicarakan tentang ViewModel.

Pertanyaan saya: Apakah Objek Transfer Data dan ViewModels sama? Ataukah ViewModel adalah sejenis sub pola dari DTO?

otonomatt
sumber
9
Saya rasa relevan untuk menyebutkan bahwa ViewModels di ASP.NET MVC tidak 100% setara dengan ViewModels di WPF (MVVM), karena sebagian besar jawaban menyebutkan MVVM dan Anda bekerja dengan ASP.NET MVC.
Matthijs Wessels

Jawaban:

105

Definisi kanonik dari DTO adalah bentuk data dari suatu objek tanpa perilaku apa pun.

ViewModels adalah model tampilan. ViewModels biasanya merupakan data penuh atau sebagian dari satu atau beberapa objek (atau DTO) ditambah anggota tambahan yang spesifik untuk perilaku tampilan (metode yang dapat dijalankan oleh tampilan, properti untuk menunjukkan cara mengalihkan elemen tampilan, dll ...). Anda bisa melihat viewmodel sebagai semua data untuk tampilan plus perilaku. ViewModels mungkin atau mungkin tidak memetakan satu ke satu objek bisnis atau DTO.

Omong-omong, proyeksi NHibernate berguna jika model tampilan tertentu membutuhkan subset data dari objek yang bertahan.

Daniel Auger
sumber
Bisakah Anda menjelaskan ini: "DTO adalah bentuk data dari suatu objek tanpa perilaku apa pun"?
roozbeh S
2
Artinya ... kelas DTO biasanya hanya berisi properti dan tidak berisi metode apa pun dengan logika bisnis dll ...
Daniel Auger
71

ViewModel dalam ASP.NET MVC prakteknya sama dengan DTO, namun ViewModel dalam pola MVVM berbeda dengan DTO karena ViewModel di MVVM memiliki perilaku tetapi DTO tidak memilikinya.

sinar
sumber
4
Ini jawaban yang bagus; meskipun detailnya singkat.
Phil
5
Mengapa ViewModel di asp.net MVC harus sama dengan DTO? Itu tidak masuk akal. Sebuah ViewModel dapat memiliki perilaku yang tidak dimiliki DTO. Ini tidak tergantung pada MVC.
Elisabeth
8
1 untuk membedakan antara ASP.NET MVC ViewModel dan MVVM ViewModel.
Ronald
5
@ Elisa - Jawaban atas pertanyaan Anda yang agak lama adalah bahwa di ASP.NET MVC, tampilan memanggil Tindakan pada pengontrol (bukan ViewModel) untuk mengubah Model dan Tampilan dengan cara tanpa kewarganegaraan. Karena itu, DTO yang dibentuk menjadi tampilan pada dasarnya sama dengan ViewModel. Namun, dalam sistem yang lebih besar dengan batas serialisasi lain, DTO mungkin bermanfaat jika terpisah dari ViewModel yang secara khusus dibentuk untuk Tampilan.
dansan
27

DTO! = ViewModel

Dalam pola MVVM ViewModel digunakan untuk mengisolasi Model dari View. Untuk merepresentasikan Model, Anda dapat menggunakan kelas DTO sederhana , yang lagi-lagi dipetakan ke database melalui misalnya NHibernate. Tapi saya belum pernah melihat kelas ViewModel yang dimodelkan sebagai DTO .. ​​Sebagian besar kelas ViewModel memiliki perilaku, yang tidak dimiliki DTO.

stiank81.dll
sumber
2
jadi DTO hanya dapat berupa struct (atau kelas yang harus meniru kemampuan struct)?
Max Alexander
20

DTO - Objek Transfer Data persis seperti yang disebutkan, wadah untuk mentransfer data. Mereka tidak memiliki perilaku tetapi hanya sekelompok setter dan getter. Beberapa orang membuatnya tidak dapat diubah dan hanya membuat yang baru saat diperlukan daripada memperbarui yang sudah ada. Mereka harus dapat diserialkan untuk memungkinkan transfer melintasi kabel.

Umumnya DTO digunakan untuk mengirimkan data dari satu lapisan ke lapisan lain melintasi batas proses karena panggilan ke layanan jarak jauh bisa mahal sehingga semua data yang diperlukan didorong ke dalam DTO dan ditransfer ke klien dalam satu bagian (berbutir kasar).

Namun, beberapa orang menggunakan gagasan DTO terikat layar (tidak ada hubungannya dengan melewati batas proses). Sekali lagi ini diisi dengan data yang diperlukan (umumnya data yang diperlukan untuk layar tertentu dan dapat berupa kumpulan data dari berbagai sumber) dan dikirim ke klien.

http://blog.jpboodhoo.com/CommentView,guid,21fe23e7-e42c-48d8-8871-86e65bcc9a50.aspx

Dalam kasus sederhana seperti yang telah dinyatakan, DTO ini dapat digunakan untuk mengikat tampilan tetapi dalam kasus yang lebih kompleks akan memerlukan pembuatan ViewModel dan pembongkaran data dari DTO ke ViewModel yang jelas lebih berhasil (saat menerapkan pola MVVM) .

Jadi sekali lagi seperti yang telah dinyatakan DTO! = ViewModel

dan

DTO dan ViewModel memiliki tujuan hidup yang berbeda

David
sumber
13

Pertama, perbedaan utama adalah bahwa ViewModel dapat memiliki perilaku atau metode yang DTO Tidak Harus !!!

Kedua, Menggunakan DTO sebagai ViewModel di ASP.NET MVC membuat aplikasi Anda terhubung erat dengan DTO dan itulah tujuan yang berlawanan dari penggunaan DTO. Jika Anda melakukannya, apa bedanya menggunakan Model domain atau DTO Anda, lebih rumit untuk mendapatkan anti-pola?

Juga ViewModel di ASP.NET dapat menggunakan DataAnnotations untuk validasi.

DTO yang sama dapat memiliki Pemetaan ViewModels yang berbeda, dan Satu ViewModel dapat disusun dari DTO yang berbeda (selalu dengan pemetaan objek, bukan komposisi). karena saya pikir lebih buruk lagi jika Anda memiliki ViewModel yang berisi DTO, kami akan memiliki masalah yang sama.

Dari lapisan presentasi Anda, pikirkan tentang DTO sebagai kontrak, Anda akan menerima objek yang harus Anda anggap asing bagi aplikasi Anda dan tidak memiliki kendali apa pun padanya (bahkan jika Anda memiliki layanan, lapisan dto, dan presentasi. adalah milikmu).

Terakhir, jika Anda melakukan pemisahan yang bersih ini, pengembang dapat bekerja sama dengan mudah. Orang yang mendesain ViewModels, Views, dan Controllers tidak perlu khawatir tentang lapisan layanan atau implementasi DTO karena dia akan membuat pemetaan saat developer lain menyelesaikan implementasinya ... Dia bahkan dapat menggunakan alat Mocking atau mocking manual untuk mengisi lapisan presentasi dengan data untuk pengujian.

riadh gomri
sumber
1
Saya baru saja menginstal VS 2012 dan melihat MVC 4 Single Page Application. Dalam proyek sampel, DTO digunakan sebagai parameter untuk metode pengontrol (atau tindakan) di WebApi. Dengan kata lain, JSON diposting ke metode tersebut dan dengan beberapa keajaiban MVC, data secara otomatis diubah ke DTO sebelum diteruskan ke metode. Apakah menurut Anda salah menggunakan DTO dalam kasus ini? Haruskah ViewModels digunakan dengan API Web? Saya meminta untuk lebih memahami, karena saya masih belum begitu paham dengan konsep-konsep ini.
Jean-François Beauchamp
Salut Jean-François Beauchamp :) ASP.NET MVC dapat mem-parsing kereta bayi url menjadi objek, misalnya: misalkan saya memiliki pemetaan ini ke metode Indeks ajax / index / {jobID} / {ResultsToSkip} / {ResultsToSend} "alih-alih memiliki di Controlle Index (int jobID, int ResultsToSkip, int ResultsToSend) Saya akan memiliki Index (request) (request adalah objek yang merangkum 3 bidang jobID ...) Jadi sekarang alih-alih params Anda berbicara dengan aplikasi Anda dengan objek yang merangkum DATA, jadi ya kita bisa mengatakan requestDTO. Misalnya Anda harus menambahkan satu bidang lain Anda hanya mengubah DTO, bukan metode antarmuka api.
riadh gomri
9

Untuk beberapa tampilan sederhana, saya akan menggunakan DTO sebagai model saya, tetapi saat Tampilan menjadi lebih kompleks, saya akan membuat ViewModels.

Bagi saya, ini adalah keseimbangan antara kecepatan (menggunakan DTO, karena saya sudah memilikinya) dan fleksibilitas (membuat ViewModels berarti lebih banyak pemisahan perhatian).

sgwill
sumber
2
Jawaban pragmatis yang bagus.
Simon Tewsi
0

Jika Anda akan menggunakan DTO sebagai ViewModel, itu berarti Anda membuat ketergantungan yang tinggi pada DTO karena beberapa alasan Anda mengubah DTO maka hal itu dapat berdampak pada ViewModel.

Lebih baik gunakan DTO & ubah menjadi viewmodel.

Lalit Khanna
sumber
-1

Kita bisa menggunakan DTOsama seperti kelas Model dan kita bisa menggunakan viewmodel ketika kita perlu menampilkan / menggunakan beberapa model data / properti dalam satu tampilan. Contoh: Saya membuat beberapa model menggunakan database framework entitas terlebih dahulu. Jadi, sekarang semua model menghasilkan berdasarkan database. dan sekarang kita membutuhkan anotasi data, untuk anotasi data tersebut kita dapat membuat nama folder DTO, Di folder DTO ini, kita dapat menyimpan semua model yang sudah menghasilkan dan menambahkan anotasi data di atas properti. Kemudian kita bisa menggunakan operasi apapun (gunakan controller, views) menggunakan kelas DTO ini. Dan ketika kita membutuhkan tampilan kompleks, maksud saya ketika kita membutuhkan banyak data kelas dalam satu tampilan di sana kita bisa menggunakan viewmodel. Untuk viewmodel kita dapat membuat nama folder viewmodel, kemudian membuat kelas khusus dan menyimpan properti yang kita butuhkan. Saya mencoba untuk membersihkan diri. Setiap saran sangat dihargai.

Md. Saddam Hossain
sumber