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?
asp.net-mvc
domain-driven-design
viewmodel
dto
otonomatt
sumber
sumber
Jawaban:
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.
sumber
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.
sumber
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.
sumber
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
sumber
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.
sumber
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).
sumber
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.
sumber
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.
sumber