Apakah itu praktik buruk yang repositori panggilan pengontrol alih-alih layanan?
untuk menjelaskan lebih lanjut:
Saya mengetahui bahwa dalam desain yang baik pengendali memanggil layanan dan layanan menggunakan repositori.
tapi kadang-kadang di controller saya tidak punya / butuh logika dan hanya perlu mengambil dari db dan meneruskannya untuk melihatnya.
dan saya bisa melakukannya hanya dengan menelepon repositori - tidak perlu memanggil layanan - apakah itu praktik yang buruk?
design-patterns
object-oriented
mvc
repository
mohsenJsh
sumber
sumber
Jawaban:
Tidak, pikirkan seperti ini: repositori adalah layanan (juga).
Jika entitas yang Anda ambil melalui repositori menangani sebagian besar logika bisnis, maka tidak perlu untuk layanan lain. Hanya memiliki repositori sudah cukup.
Bahkan jika Anda memiliki beberapa layanan yang harus Anda lewati untuk memanipulasi entitas Anda. Ambil entitas dari repositori terlebih dahulu dan kemudian berikan ke layanan tersebut. Mampu membuang HTTP 404 bahkan sebelum mencoba sangat mudah.
Juga untuk skenario baca, Anda hanya perlu entitas untuk memproyeksikannya ke DTO / ViewModel. Memiliki lapisan layanan di antaranya kemudian sering menghasilkan banyak metode yang agak jelek.
sumber
Ini bukan praktik yang buruk bagi pengontrol untuk memanggil repositori secara langsung. "Layanan" hanyalah alat lain, jadi gunakan di tempat yang masuk akal.
NikolaiDante berkomentar:
Saya tidak berpikir konsistensi adalah aspek yang paling penting. Kelas "service" dimaksudkan untuk merangkum beberapa logika level yang lebih tinggi sehingga controller tidak perlu mengimplementasikannya. Jika tidak ada "logika tingkat tinggi" yang diperlukan untuk operasi yang diberikan, langsung saja ke repositori.
Untuk mempromosikan Kepedulian Terpisah yang baik dan kemampuan testabilitas, repositori haruslah merupakan ketergantungan yang Anda berikan ke layanan melalui konstruktor:
Jika mencari catatan dalam database membutuhkan beberapa jenis permintaan parameter, sebuah kelas layanan mungkin merupakan tempat yang baik untuk mengambil dalam model tampilan Anda dan membangun kueri yang kemudian dijalankan oleh repositori.
Demikian pula, jika Anda memiliki model tampilan kompleks untuk formulir, kelas layanan dapat merangkum logika membuat, memperbarui, dan menghapus catatan dengan memanggil metode pada Model Domain / Entitas Anda, kemudian bertahan dengan menggunakan repositori.
Pergi ke arah yang berlawanan, jika controller Anda perlu mendapatkan catatan dengan ID-nya, kemudian mendelegasikan ke objek layanan untuk ini seperti memukul paku payung dengan palu godam - itu cara yang lebih dari yang Anda butuhkan.
Saya telah menemukan bahwa pengontrol berada pada posisi terbaik untuk menangani transaksi, atau objek Unit Kerja . Pengontrol atau objek Unit Kerja kemudian akan mendelegasikan ke objek layanan untuk operasi yang kompleks, atau langsung ke repositori untuk operasi sederhana (seperti menemukan catatan dengan Id).
Saya pikir campuran layanan dan bekerja dengan repositori secara langsung dapat diterima. Anda dapat lebih lanjut merangkum transaksi dalam objek Unit Kerja jika Anda merasa perlu.
Rincian tanggung jawab seperti ini:
sumber
DbContext
ini adalah nama yang buruk dalam kasus ini. Saya akan mengubahnya. Saya menggunakan NHibernate, dan repositori (atau konteks jika berguna) mengelola akhir database, jadi mengubah mekanisme kegigihan tidak memerlukan perubahan kode di luar konteks.Tergantung pada arsitektur Anda. Saya menggunakan Spring, dan transaksionalitas selalu dikelola oleh layanan.
Jika Anda memanggil repositori langsung untuk operasi tulis (atau layanan sederhana tanpa logika yang hanya mendelegasikan ke repositori), mungkin Anda menggunakan beberapa transaksi basis data untuk operasi yang harus dilakukan dalam satu. Itu akan menyebabkan data tidak koheren dalam database Anda. Sebagai aturan umum, operasi basis data harus berhasil, atau gagal, tetapi operasi setengah kerja adalah penyebab sakit kepala.
Untuk alasan itu saya berpikir bahwa memanggil repositori langsung dari pengontrol, atau menggunakan layanan pendelegasian sederhana, adalah praktik yang buruk. Anda mulai melakukannya hanya untuk membaca, dan segera Anda, atau satu atau teman Anda akan mulai melakukannya untuk operasi menulis.
sumber