Saya sedang membangun aplikasi MVC pertama saya di Visual Studio 2013 (MVC 5) dan saya agak tidak jelas tentang cara terbaik untuk mengatur model saya.
Saya telah membuat model kerangka kerja menggunakan kode-pertama dari database yang ada. Insting pertama saya adalah membuat beberapa kelas perantara yang akan menjadi model yang digunakan oleh pandangan dan membuat kelas-kelas itu bekerja dengan kelas kerangka entitas.
Ketika saya sedang menulis kelas perantara, saya menyadari bahwa saya kebanyakan hanya mengimplementasikan kembali banyak hal yang sudah dilakukan oleh kelas EF hanya dengan setter pribadi sesekali atau dilemparkan dari satu tipe data ke tipe data lainnya. Jadi itu sepertinya sia-sia.
Apakah aturan umum untuk langsung menggunakan kelas kerangka kerja entitas sebagai Model untuk aplikasi MVC? Atau adakah manfaat yang saya lewatkan untuk membangun kelas perantara ini?
sumber
Jawaban:
Dalam aplikasi saya, saya selalu memisahkan hal-hal, dengan model yang berbeda untuk database (Entity Framework) dan MVC. Saya telah memisahkan ini ke dalam proyek yang berbeda juga:
Alih-alih memegang referensi ke objek lain seperti yang dilakukan entitas domain, model MVC menyimpan ID sebagai bilangan bulat.
Ketika permintaan GET untuk halaman masuk, pengontrol MVC melakukan kueri basis data, yang mengembalikan entitas. Saya telah menulis metode "Konverter" yang mengambil entitas domain dan mengubahnya menjadi model MVC. Ada metode lain yang melakukan yang sebaliknya (dari model MVC ke entitas domain). Model kemudian diteruskan ke tampilan, dan dengan demikian ke klien.
Ketika permintaan POST masuk, pengontrol MVC mendapatkan model MVC. Metode konverter mengubahnya menjadi entitas domain. Metode ini juga melakukan validasi apa pun yang tidak dapat dinyatakan sebagai atribut, dan memastikan bahwa jika entitas domain sudah ada, kami memperbaruinya alih-alih mendapatkan yang baru. Metode biasanya terlihat seperti ini:
Dengan menggunakan metode ini saya mengambil duplikasi yang seharusnya terjadi di setiap pengontrol. Penggunaan obat generik dapat mereduplikasi hal-hal lebih jauh.
Melakukan hal-hal seperti ini memberikan banyak manfaat:
sumber
Saya akan mengatakan itu sangat tergantung pada aplikasi Anda. Apakah hanya melakukan CRUD murni, tanpa logika bisnis? Kemudian saya akan menggunakan model EF secara langsung dalam pandangan saya.
Sebagian besar waktu setidaknya ada beberapa logika bisnis yang terlibat dan kemudian lapisan antara data / model EF dan tampilan mungkin merupakan ide yang bagus. Dalam hal ini mungkin tepat untuk melakukan "CQRS-lite" (lihat di bawah) dan menggunakan model yang berbeda untuk masuk dan keluar dari pengontrol Anda. Sebagian besar waktu model baca jauh lebih "gemuk" daripada model tulis ...
Namun, jika aplikasi mengandung banyak logika bisnis dan / atau kebutuhan untuk skala banyak, saya akan mengimplementasikan setidaknya inti dari itu menggunakan CQRS (Command Query Responsibility Segregation), DDD (Desain Domain Driven Design) dan mungkin Event Sourcing. Kemudian EF dapat digunakan sebagai fasad model baca.
Juga ingat bahwa Anda tidak perlu tetap berpegang pada satu strategi / pola untuk seluruh aplikasi, beberapa area mungkin murni CRUD dan area lain mungkin mengandung banyak logika bisnis ...
sumber