Dalam sistem MVC, di mana seharusnya kode persistensi database berada?

21

Saya telah melihat banyak konfigurasi untuk mempertahankan informasi ke database. Secara umum, tiga jenis desain tampak umum di sudut dunia saya:

  • Pengendali mengelola kegigihan
  • Model mengelola kegigihan
  • Perpustakaan pihak ketiga mengelola kegigihan, biasanya memerlukan semacam anotasi pada model.

Saya bertanya-tanya konfigurasi mana (jika ada) yang, secara konsep, yang paling mudah digunakan / paling kompatibel dengan arsitektur MVC?

(Jika bukan yang saya daftarkan, tolong berikan garis besar / ikhtisar sebagai bagian dari jawaban)

blueberryfields
sumber

Jawaban:

13

Pilihan kedua dan ketiga Anda identik. M dalam MVC bukan model data, melainkan model domain. Ini termasuk ketekunan, apakah dilakukan secara langsung atau melalui ORM, dan keduanya benar-benar benar.

Pengontrol harus mengelola aliran situs dan meneruskan barang ke domain (kadang-kadang melalui lapisan layanan) untuk ditangani, jadi tetap ada yang salah - atau setidaknya secara semantik tidak nyaman.

pdr
sumber
2
Saya tidak setuju sampai batas tertentu. Pemanfaatan konkrit dari ketekunan adalah logika aplikasi dan dengan demikian termasuk dalam Lapisan aplikasi dan bukan dalam Lapisan domain. Lapisan domain (berisi model domain) harus mengabaikan ketekunan untuk program bisnis kasual. Pengontrol adalah orkestra . Itu dapat mengatur layanan (data-), UI dan model domain.
Falcon
1
@ Falcon: Sementara controller harus mengontrol kapan data diambil dari dan bertahan ke database, itu baik-baik saja untuk memberitahu model untuk melakukannya. Menggunakan ORM (standar atau roll milik Anda sendiri) biasanya berarti memberi tahu model untuk memuat / menyimpan yang kemudian didelegasikan ke ORM. Cara lain bisa dengan membuat controller memberitahu ORM untuk memuat / menyimpan sesuatu yang lewat itu model kelas untuk memuat (dengan kriteria pemilihan) atau contoh model untuk menyimpan. Apa pun itu, pemuatan / penghematan yang sebenarnya akan terkait erat dengan model.
Marjan Venema
@Marjan Venema: Ya, saya setuju, tetapi pertanyaannya adalah di mana kode itu harus hidup. Saya berusaha untuk menjaga agar model tersebut tidak tahu apa-apa tentang kegigihan dan hanya memodelkan entitas domain dengan perilaku dan interaksi mereka. Apa pun akan hidup dalam lapisan aplikasi (karena ini adalah aplikasi model saya). Memetakan informasi / akses data sepenuhnya dipisahkan dari model domain dan juga dapat menangani versi (upgrade / downgrade). Aplikasi akses data juga hidup di lapisan aplikasi (yang berisi layanan, repositori, dll.)
Falcon
@ Falcon: Ya, itu adalah cara yang baik untuk melakukannya dan bagaimana saya telah melakukannya di masa lalu menggunakan kelas pemetaan yang terpisah. Namun dengan munculnya RTTI (Delphi) dan refleksi (.Net dan lain-lain) yang diperluas, saya tidak memiliki keraguan untuk menggunakan ini bersama dengan penjelasan atribut Business Model Model untuk mendapatkan semuanya berjalan dan hanya menggunakan kelebihan, kait kode ke dalam dan / atau kelas inisialisasi kode khusus untuk menjaga versi database.
Marjan Venema
5

Secara realistis, MVC sebagian besar merupakan pola implementasi UI, jadi pertanyaannya agak diperdebatkan. Namun, sebenarnya hanya ada dua opsi gambaran besar. Pengontrol Anda biasanya mengirimkan permintaan untuk memuat atau menyimpan entitas dalam model Anda menggunakan 1) lapisan layanan atau 2) pola Rekaman Aktif.

Lapisan layanan dapat mengambil salah satu dari sejumlah bentuk, meskipun preferensi pribadi saya adalah untuk bekerja dengan abstraksi repositori untuk entitas akar agregat, implementasi konkret yang baik akan bekerja dengan semacam ORM, atau DAO ringan, atau API untuk beberapa toko non-relasional jika itu masuk akal untuk aplikasi tersebut.

Pola Rekaman Aktif berarti bahwa model Anda memiliki tanggung jawab untuk kegigihan, meskipun biasanya berarti kelas dasar dari beberapa jenis mengelola pemetaan ke toko Anda, sehingga model Anda tidak benar-benar terlibat secara langsung.

Pada dasarnya, controller mengirimkan permintaan untuk tetap objek, apakah itu panggilan ke repositori Anda, implementasi UnitOfWork Anda, atau metode Simpan di entitas Anda. Jika Anda menggunakan repositori, objek model Anda tidak tahu apa-apa.

Jason True
sumber
3

Dalam sistem MVC (model-view-controller), model berisi data. Jadi saya percaya, ketekunan database harus ada di dalamnya.

Nettogrof
sumber
2

Sebagian besar sampel MVC tingkat tinggi yang saya lihat memiliki infrastructurelapisan terpisah yang memiliki kode implementasi basis data aktual (yaitu panggilan khusus ke NHibernate, atau EF atau Linq atau apa pun lapisan data Anda), sedangkan lapisan "model" (sering juga layer "Domain") memiliki antarmuka yang menentukan layanan data.

Wayne Molina
sumber
0

Praktik standar dalam MVC adalah memasukkan struktur data dan kegigihan dalam lapisan M (odel).

Lapisan model tidak hanya menyertakan kelas (POCOs dll) yang akan Anda gunakan dalam aplikasi Anda. Mereka termasuk repositori untuk kelas-kelas itu.

Contohnya adalah repositori tempat Anda memiliki banyak instance kelas data, yaitu:

Clients repository

AllClients()
RecentClients()
ClientByID(int id)

Anda akan dapat mengatur domain model Anda dengan lebih baik, dan juga memiliki akses ke data Anda melalui banyak cara, tetapi lapisan data / model akan tetap kompak dan kuat

Mihalis Bagos
sumber