Gunakan lapisan layanan dengan MVC

13

Jika pengontrol menjadi terlalu gemuk dan instantiasi model mulai bertambah, lapisan layanan dapat digunakan.

  • Jika saya hanya membungkus logika di dalam kelas layanan, saya akan mendapatkan banyak Layanan dengan satu / dua metode. Ini terasa seperti bau kode. Adakah praktik terbaik tentang ini?

  • Bisakah layanan instantiate model?

  • Jika layanan instantiates model, layanan tidak dapat diuji unit. Mereka hanya bisa dicakup oleh tes integrasi?

danidacar
sumber

Jawaban:

24

Dalam 'SOLID' the 'I' adalah singkatan dari Segregation Interface. Seluruh gagasan prinsip ini adalah untuk membagi antarmuka besar menjadi lebih kecil, lebih modular. Dalam layanan MVC biasanya akan memiliki antarmuka yang akan mengandalkan pengontrol. Anda tidak ingin pengendali Anda tahu tentang implementasi nyata dari layanan itu. Oleh karena itu, banyak layanan dengan satu atau dua metode adalah hal yang baik untuk dimiliki.

Layanan biasanya mengembalikan DTO dalam aplikasi besar atau model domain secara langsung dalam aplikasi yang lebih kecil. DTO biasanya berarti lebih banyak pekerjaan, tetapi pemisahan keprihatinan yang lebih baik. Aliran khas adalah:

  • Layanan panggilan pengontrol
  • Layanan mengembalikan objek (baik itu DTO, model domain atau yang lainnya)
  • Pengontrol memetakan DTO / model domain ke model tampilan

Pemetaan dapat dilakukan secara manual, tetapi sebagian besar pengembang lebih suka menggunakan kerangka pemetaan otomatis seperti Automapper karena kami tidak suka menulis kode pipa ledeng dan kami bisa sangat malas :-)

http://en.wikipedia.org/wiki/Interface_segregation_principle

https://github.com/AutoMapper/AutoMapper

Salah satu dari banyak diskusi tentang stackoverflow mengenai penggunaan DTO dan model domain: /programming/2680071/dto-or-domain-model-object-in-the-view-layer

CodeART
sumber
1
Saya akan berhati-hati menggunakan auto mapper di sini uglybugger.org/software/post/…
Daniel Little
AutoMapper dilengkapi dengan fungsi pengujian unit bawaan yang memungkinkan Anda memverifikasi semua rutinitas pemetaan Anda dengan satu baris. Penulis posting ini tidak menyebutkan itu.
CodeART
Tapi dia tahu tentang itu, dan telah menggunakannya. Komentar masuk ke ini sedikit.
Daniel Little
2
Banyak kelas dengan hanya satu atau dua metode biasanya berarti mereka tidak kohesif. Lapisan layanan, jika ada, harus tipis dengan sebagian besar logika berada di model. Tampaknya tidak ada gunanya untuk mengikat pandangan ke objek bodoh yang tidak lebih dari tas properti. Model dalam MVC harus berupa model domain kaya, bukan model yang anemia Martinfowler.com/bliki/AnemicDomainModel.html
Andy
3

Dalam MVC Model, bukan hanya DTO atau set Manajer / Layanan tetapi dimaksudkan untuk mewakili konsep-konsep aplikasi Anda model. Anda dapat menganggap ini sebagai keseluruhan domain atau logika bisnis termasuk status dan perilaku. Sekarang mengingat bahwa kita tahu bahwa tujuan controller menjadi sedikit lebih jelas. Tugasnya hanyalah menerjemahkan perintah ke Model dan hasilnya kembali ke tampilan. Ini biasanya dilakukan dalam bentuk ViewModels yang berbeda tetapi sering bingung dengan Model di MVC.

Jika Anda tidak memiliki Model yang terdefinisi dengan baik maka Anda mungkin sampai pada titik di mana sebagian besar logika itu sekarang berada di Pengontrol sendiri. Pada titik ini untuk mulai mengurangi ukuran controller Anda, Anda dapat mulai menarik logika ini kembali ke objek manajer atau layanan. Layanan ini biasanya kembali dan beroperasi pada objek DTO / Entity like. Kemudian controller menjadi layer pemetaan antara layanan ini dan Model Tampilan. Untuk beberapa tips bagus tentang pemetaan, lihat artikel ini. Teman jangan biarkan teman menggunakan AutoMapper .

Adapun pertanyaan Anda, yang pertama sangat tergantung pada aplikasi Anda. Anda harus melakukan refactoring di sepanjang jalan yang seharusnya menjadi lebih jelas setelah Anda menghapus logika dari pengontrol Anda. Adapun pengujian tidak ada masalah instantiate model di dalam layanan namun jika Anda merasa pengujian itu mungkin hanya tanda Anda perlu memecah layanan menjadi bagian-bagian yang lebih kecil masing-masing dengan tanggung jawab tunggal.

Daniel Little
sumber
3

Pengontrol hanya boleh berisi panggilan ke model (di mana logika bisnis terjadi) dan berdasarkan panggilan tersebut memberikan data untuk tampilan (objek informasi atau pesan kesalahan) karena itu pengontrol akan cukup kecil bahkan untuk halaman yang sangat kompleks, jika pengontrol masih menjadi sangat besar Anda harus berpikir bahwa mungkin halaman itu harus diperluas menjadi lebih banyak halaman.

Masih modelnya bisa sangat besar ... solusi yang saya temukan adalah memiliki variabel di dalam controller yang memberitahu model apa yang akan dimuat dan untuk tugas tertentu saya memuat model tertentu.

Coba patuhi model-view-controller model clean seperti ini:

  • lihat: menampilkan data
  • controller: mengumpulkan input pengguna, meminta model untuk data yang diminta dan mengirimkannya kembali ke tampilan
  • model: berinteraksi dengan database dan melakukan tindakan logis untuk menyiapkan informasi
aaa
sumber
-1

Saya menemukan layanan sangat membantu untuk melakukan logika yang mungkin perlu dilakukan oleh lebih dari satu pengontrol atau yang tidak cukup spesifik untuk menjadi bagian dari pengontrol, selain itu menghentikan pengontrol saya menjadi terlalu besar dan sulit dibaca .. .

Saya pribadi tidak setuju dengan 'aaa' ketika dia mengatakan bahwa "model (di mana logika bisnis berbahagia)" karena itulah alasan mengapa Anda memiliki pengontrol, dalam model pendapat saya perlu pengabstraksi data sederhana sehingga pengontrol dapat melakukan tugas yang diperlukan; lagi layanan tidak boleh terlibat dalam tugas abstraksi data ...

hanya mengatakan kamu ....

Fredylg
sumber
1
Jika model Anda hanya untuk Anda, Anda telah jatuh ke dalam model domain anemic
Andy