Dalam MVC, DAO harus dipanggil dari Controller atau Model

14

Saya telah melihat berbagai argumen terhadap DAO yang dipanggil dari kelas Controller secara langsung dan juga DAO dari kelas Model. Infact Saya pribadi merasa bahwa jika kita mengikuti pola MVC, controller tidak boleh digabungkan dengan DAO, tetapi kelas Model harus memanggil DAO dari dalam dan pengontrol harus memanggil kelas model. Mengapa, kita dapat memisahkan kelas model dari aplikasi web dan mengekspos fungsi untuk berbagai cara seperti untuk layanan REST untuk menggunakan kelas model kita.

Jika kita menulis permintaan DAO di controller, itu tidak mungkin untuk layanan REST untuk menggunakan kembali fungsi kan? Saya telah merangkum kedua pendekatan di bawah ini.

Pendekatan # 1

  public class CustomerController extends HttpServlet {

    proctected void doPost(....)  {

            Customer customer = new Customer("xxxxx","23",1);
            new CustomerDAO().save(customer);

    }


 }

Pendekatan # 2

  public class CustomerController extends HttpServlet {

    proctected void doPost(....)  {

            Customer customer = new Customer("xxxxx","23",1);
            customer.save(customer);

    }


 }

 public class Customer {

   ...........

   private void save(Customer customer){

        new CustomerDAO().save(customer);

   }

}

Catatan -

Berikut adalah definisi Model:

Model: Model mengelola perilaku dan data domain aplikasi, merespons permintaan informasi tentang statusnya (biasanya dari tampilan), dan merespons instruksi untuk mengubah status (biasanya dari pengontrol).

Dalam sistem yang digerakkan oleh peristiwa, model memberi tahu pengamat (biasanya melihat) ketika informasi berubah sehingga mereka dapat bereaksi.

Saya perlu pendapat ahli tentang ini karena saya menemukan banyak menggunakan # 1 atau # 2, Jadi yang mana?


sumber
Pengontrol harus memuat semuanya dari model dan meneruskannya ke tampilan.
jgauffin
apakah Anda saran mendekati # 2?
1
"Pengontrol dapat mengirim perintah ke tampilan terkait untuk mengubah presentasi tampilan model (misalnya, dengan menggulir dokumen). Ia dapat mengirim perintah ke model untuk memperbarui keadaan model (misalnya, mengedit dokumen)." .. emm .. di mana katanya, controller itu harus mengekstraksi data atau meneruskannya?
mefisto

Jawaban:

31

Menurut pendapat saya, Anda harus membedakan antara pola MVC dan arsitektur 3-tier. Untuk menyimpulkan:

Arsitektur 3 tingkat:

  • data: data yang bertahan;
  • layanan: bagian logis dari aplikasi;
  • presentasi: hmi, layanan web ...

Pola MVC terjadi di tingkat presentasi arsitektur di atas (untuk webapp):

  • data: ...;
  • layanan: ...;
  • presentasi:
    • controller: memotong permintaan HTTP dan mengembalikan respons HTTP;
    • model: menyimpan data untuk ditampilkan / dirawat;
    • tampilan: mengatur output / tampilan.

Siklus hidup permintaan HTTP khas :

  1. Pengguna mengirim permintaan HTTP;
  2. Kontroler memotongnya;
  3. Pengontrol memanggil layanan yang sesuai;
  4. Layanan memanggil dao yang sesuai, yang mengembalikan beberapa data yang ada (misalnya);
  5. Layanan memperlakukan data, dan mengembalikan data ke controller;
  6. Pengontrol menyimpan data dalam model yang sesuai dan memanggil tampilan yang sesuai;
  7. Tampilan bisa dipakai dengan data model, dan dikembalikan sebagai respons HTTP.
sp00m
sumber
Apa yang Anda sebut "siklus hidup permintaan HTTP khas" bukan MVC. Dan DAO hanyalah sebuah objek, yang memfasilitasi interaksi / terjemahan antara logika domain dan kegigihan. Ini BUKAN nama yang berbeda untuk catatan aktif. Juga .. sejak kapan model menjadi bagian dari presentasi ?!
mefisto
1
@teresko 1) Ya, itu adalah MVC, tetapi dalam arsitektur 3-tier. Jika tidak, mengapa? 2) Anda benar, saya mengedit. 3) Karena seluruh pola MVC terjadi di tingkat presentasi. Contoh umum: Spring MVC, yang modelnya hanya Peta yang berisi pasangan nilai kunci. SpringFuse telah membuat pilihan ini juga.
sp00m
2
Saya harus setuju dengan @ sp00m di sini ... Deskripsi tentang permintaan HTTP khas akurat untuk aplikasi web MVC, dan posisinya tentang Model (sebagai 'M' dalam MVC) sebagai bagian dari tingkat presentasi juga benar . Dalam aplikasi MVC n-tier, 'Model' biasanya fasad tingkat presentasi di atas tingkatan di bawah ini.
Eric King
8

Dari lapisan model.

Untuk lebih tepatnya: dari layanan, yang terkandung dalam lapisan model , karena mereka mengatur interaksi antara objek domain dan abstraksi logika penyimpanan.

Pengontrol hanya bertanggung jawab untuk mengubah keadaan lapisan model. DAO adalah bagian dari mekanisme ketekunan. Ini merupakan bagian dari domain bisnis dan logika aplikasi. Jika Anda mulai berinteraksi dengan DAO di controller, Anda akan membocorkan logika domain di lapisan presentasi .

mefisto
sumber
Untuk menggunakan lapisan layanan, harus pola DDD? koreksi saya jika saya salah. Apakah kami memiliki lapisan layanan di MVC?
Kamu bisa memiliki. Layanan digunakan untuk memisahkan logika domain dari logika aplikasi. Ini menjadi perlu, maka Anda pindah dari struktur domain CRUD murni (catatan aktif), ke sesuatu yang memisahkan logika penyimpanan dari logika domain. Dalam lapisan model yang sepenuhnya terwujud, Anda memiliki 3 pemisahan logis: ketekunan, domain, dan aplikasi.
mefisto
3

Saya tidak yakin apa pola panggilan MVC resmi, tapi saya biasanya suka memiliki lapisan "layanan" di antara pengontrol dan DAO. Pengontrol menarik data dari permintaan dan meneruskannya ke kelas layanan yang sesuai. Kelas layanan bertanggung jawab untuk memanggil satu atau lebih DAO yang lulus kelas model. Kelas-kelas model tersebut kemudian dikirim kembali ke controller untuk dikirim ke lapisan tampilan. Memasukkan lapisan layanan membantu dengan menggunakan kembali karena beberapa pengendali dapat menggunakan metode lapisan layanan yang sama.

Shane
sumber