Sunting: Saya memperbarui jawaban ini di Blog saya:
http://www.samwheat.com/post/The-function-of-ViewModels-in-MVC-web-development
Jawaban saya agak panjang tapi saya pikir penting untuk membandingkan model tampilan dengan tipe lain dari model yang umum digunakan untuk memahami mengapa mereka berbeda dan mengapa mereka diperlukan.
Untuk meringkas, dan untuk langsung menjawab pertanyaan yang ditanyakan:
Secara umum, model tampilan adalah objek yang berisi semua properti dan metode yang diperlukan untuk membuat tampilan. Lihat model properti sering terkait dengan objek data seperti pelanggan dan pesanan dan di samping itu mereka juga berisi properti yang terkait dengan halaman atau aplikasi itu sendiri seperti nama pengguna, nama aplikasi dll. Lihat model menyediakan objek yang nyaman untuk diteruskan ke mesin rendering untuk buat halaman html. Salah satu dari banyak alasan untuk menggunakan model tampilan adalah bahwa model tampilan menyediakan cara untuk menguji unit tugas presentasi tertentu seperti menangani input pengguna, memvalidasi data, mengambil data untuk ditampilkan, dll.
Berikut adalah perbandingan model Entity (model a.ka. DTO), Model Presentasi, dan Model Tampilan.
Objek Transfer Data alias “Model”
Objek Transfer Data (DTO) adalah kelas dengan properti yang cocok dengan skema tabel dalam database. DTO dinamai untuk penggunaan umum mereka untuk bolak-balik data ke dan dari penyimpanan data.
Karakteristik DTO:
• Apakah objek bisnis - definisi mereka bergantung pada data aplikasi.
• Biasanya hanya berisi properti - tanpa kode.
• Terutama digunakan untuk mengangkut data ke dan dari database.
• Properti persis atau sangat cocok dengan bidang pada tabel tertentu di penyimpanan data.
Tabel database biasanya dinormalisasi oleh karena itu DTO biasanya dinormalisasi juga. Ini membuat mereka terbatas digunakan untuk menyajikan data. Namun, untuk struktur data sederhana tertentu mereka sering melakukannya dengan cukup baik.
Berikut adalah dua contoh bagaimana DTO akan terlihat:
public class Customer
{
public int ID { get; set; }
public string CustomerName { get; set; }
}
public class Order
{
public int ID { get; set; }
public int CustomerID { get; set; }
public DateTime OrderDate { get; set; }
public Decimal OrderAmount { get; set; }
}
Model Presentasi
Model presentasi adalah kelas utilitas yang digunakan untuk menyajikan data di layar atau laporan. Model presentasi biasanya digunakan untuk memodelkan struktur data kompleks yang terdiri dari data dari beberapa DTO. Model presentasi sering mewakili tampilan data yang didenormalisasi.
Karakteristik Model Presentasi:
• Apakah objek bisnis - definisi mereka bergantung pada data aplikasi.
• Mengandung sebagian besar properti. Kode biasanya terbatas pada memformat data atau mengonversi ke atau dari DTO. Model Presentasi tidak boleh mengandung logika bisnis.
• Sering menyajikan tampilan data yang didenormalisasi. Artinya, mereka sering menggabungkan properti dari beberapa DTO.
• Sering berisi properti dengan tipe dasar berbeda dari DTO. Misalnya jumlah dolar dapat direpresentasikan sebagai string sehingga mereka dapat mengandung koma dan simbol mata uang.
• Sering didefinisikan oleh bagaimana mereka digunakan serta karakteristik objek mereka. Dengan kata lain, DTO sederhana yang digunakan sebagai model pendukung untuk membuat kisi sebenarnya juga merupakan model presentasi dalam konteks kisi itu.
Model presentasi digunakan "sesuai kebutuhan" dan "di mana diperlukan" (sedangkan DTO biasanya terkait dengan skema database). Model presentasi dapat digunakan untuk memodelkan data untuk seluruh halaman, kisi pada halaman, atau dropdown pada kisi pada halaman. Model presentasi sering berisi properti yang merupakan model presentasi lainnya. Model presentasi sering dibangun untuk tujuan penggunaan tunggal seperti untuk membuat grid tertentu pada satu halaman.
Contoh model presentasi:
public class PresentationOrder
{
public int OrderID { get; set; }
public DateTime OrderDate { get; set; }
public string PrettyDate { get { return OrderDate.ToShortDateString(); } }
public string CustomerName { get; set; }
public Decimal OrderAmount { get; set; }
public string PrettyAmount { get { return string.Format("{0:C}", OrderAmount); } }
}
Lihat Model
Model tampilan mirip dengan model presentasi di yang merupakan kelas dukungan untuk rendering tampilan. Namun sangat berbeda dari Model Presentasi atau DTO dalam hal bagaimana itu dibangun. Lihat model sering mengandung sifat yang sama seperti model presentasi dan DTO dan karena alasan ini mereka sering bingung satu sama lain.
Karakteristik Model Tampilan:
• Apakah satu-satunya sumber data yang digunakan untuk membuat halaman atau layar. Biasanya ini berarti bahwa model tampilan akan mengekspos setiap properti yang setiap kontrol pada halaman perlu render dengan benar. Menjadikan model tampilan sumber tunggal data untuk tampilan sangat meningkatkan kemampuan dan nilainya untuk pengujian unit.
• Apakah objek komposit yang berisi properti yang terdiri dari data aplikasi serta properti yang digunakan oleh kode aplikasi. Karakteristik ini sangat penting ketika merancang model tampilan untuk dapat digunakan kembali dan dibahas dalam contoh di bawah ini.
• Berisi kode aplikasi. Lihat Model biasanya berisi metode yang dipanggil saat rendering dan ketika pengguna berinteraksi dengan halaman. Kode ini biasanya terkait dengan penanganan acara, animasi, visibilitas kontrol, gaya, dll.
• Berisi kode yang memanggil layanan bisnis untuk tujuan mengambil data atau mengirimkannya ke server database. Kode ini sering keliru ditempatkan di sebuah pengontrol. Memanggil layanan bisnis dari pengontrol biasanya membatasi kegunaan model tampilan untuk pengujian unit. Agar jelas, lihat model itu sendiri tidak boleh mengandung logika bisnis tetapi harus membuat panggilan ke layanan yang memang mengandung logika bisnis.
• Sering berisi properti yang merupakan model tampilan lain untuk halaman atau layar lain.
• Ditulis "per halaman" atau "per layar". Model Tampilan yang unik biasanya ditulis untuk setiap halaman atau layar dalam suatu aplikasi.
• Biasanya berasal dari kelas dasar karena sebagian besar halaman dan layar berbagi properti umum.
Lihat Komposisi Model
Seperti yang dinyatakan sebelumnya, model tampilan adalah objek komposit yang menggabungkan properti aplikasi dan properti data bisnis pada objek tunggal. Contoh properti aplikasi yang umum digunakan yang digunakan pada model tampilan adalah:
• Properti yang digunakan untuk menampilkan status aplikasi seperti pesan kesalahan, nama pengguna, status, dll.
• Properti yang digunakan untuk memformat, menampilkan, menyesuaikan dgn mode, atau menghidupkan animasi.
• Properti yang digunakan untuk pengikatan data seperti objek daftar dan properti yang menyimpan data antara yang diinput oleh pengguna.
Contoh berikut menunjukkan mengapa sifat komposit dari model tampilan adalah penting dan bagaimana kita dapat membangun Model Tampilan yang paling efisien dan dapat digunakan kembali.
Asumsikan kita sedang menulis aplikasi web. Salah satu persyaratan desain aplikasi adalah bahwa judul halaman, nama pengguna, dan nama aplikasi harus ditampilkan pada setiap halaman. Jika kami ingin membuat halaman untuk menampilkan objek urutan presentasi, kami dapat memodifikasi model presentasi sebagai berikut:
public class PresentationOrder
{
public string PageTitle { get; set; }
public string UserName { get; set; }
public string ApplicationName { get; set; }
public int OrderID { get; set; }
public DateTime OrderDate { get; set; }
public string PrettyDate { get { return OrderDate.ToShortDateString(); } }
public string CustomerName { get; set; }
public Decimal OrderAmount { get; set; }
public string PrettyAmount { get { return string.Format("{0:C}", OrderAmount); } }
}
Desain ini mungkin berfungsi ... tetapi bagaimana jika kita ingin membuat halaman yang akan menampilkan daftar pesanan? Properti PageTitle, UserName, dan ApplicationName akan diulang dan menjadi sulit untuk digunakan. Juga, bagaimana jika kita ingin mendefinisikan beberapa logika level-halaman dalam konstruktor kelas? Kami tidak dapat lagi melakukannya jika kami membuat instance untuk setiap pesanan yang akan ditampilkan.
Komposisi atas warisan
Berikut adalah cara kami mem-ulang faktor model presentasi urutan sehingga menjadi model tampilan sebenarnya dan akan berguna untuk menampilkan objek PresentationOrder tunggal atau koleksi objek PresentationOrder:
public class PresentationOrderVM
{
// Application properties
public string PageTitle { get; set; }
public string UserName { get; set; }
public string ApplicationName { get; set; }
// Business properties
public PresentationOrder Order { get; set; }
}
public class PresentationOrderVM
{
// Application properties
public string PageTitle { get; set; }
public string UserName { get; set; }
public string ApplicationName { get; set; }
// Business properties
public List<PresentationOrder> Orders { get; set; }
}
Melihat dua kelas di atas kita dapat melihat bahwa salah satu cara untuk berpikir tentang model tampilan adalah bahwa itu adalah model presentasi yang berisi model presentasi lain sebagai properti. Model presentasi tingkat atas (yaitu model tampilan) berisi properti yang relevan dengan halaman atau aplikasi sementara model presentasi (properti) berisi properti yang relevan dengan data aplikasi.
Kami dapat mengambil desain kami selangkah lebih maju dan membuat kelas model tampilan dasar yang dapat digunakan tidak hanya untuk PresentationOrders, tetapi untuk kelas lainnya juga:
public class BaseViewModel
{
// Application properties
public string PageTitle { get; set; }
public string UserName { get; set; }
public string ApplicationName { get; set; }
}
Sekarang kita dapat menyederhanakan PresentationOrderVM kita seperti ini:
public class PresentationOrderVM : BaseViewModel
{
// Business properties
public PresentationOrder Order { get; set; }
}
public class PresentationOrderVM : BaseViewModel
{
// Business properties
public List<PresentationOrder> Orders { get; set; }
}
Kita dapat membuat BaseViewModel kita bahkan lebih dapat digunakan kembali dengan membuatnya generik:
public class BaseViewModel<T>
{
// Application properties
public string PageTitle { get; set; }
public string UserName { get; set; }
public string ApplicationName { get; set; }
// Business property
public T BusinessObject { get; set; }
}
Sekarang implementasi kami sangat mudah:
public class PresentationOrderVM : BaseViewModel<PresentationOrder>
{
// done!
}
public class PresentationOrderVM : BaseViewModel<List<PresentationOrder>>
{
// done!
}