Lapisan layanan vs DAO - Mengapa keduanya?

64

Saya telah bekerja dengan SpringMVC, Hibernate, dan beberapa database dalam contoh aplikasi web java.

Ada beberapa yang berbeda yang melakukan ini, tetapi tutorial integrasi Spring 3 dan hibernate dengan contoh ini memiliki kelas model, view (dalam jsp), dan kelas layanan dan dao untuk controller.

Pertanyaan saya adalah, bukankah kelas layanan dan DAO melakukan hal yang sama? Mengapa Anda membutuhkan keduanya?

Ini adalah tutorial yang sebenarnya saya gunakan: http://fruzenshtein.com/spring-mvc-security-mysql-hibernate/

Jeff
sumber

Jawaban:

60

Secara umum DAO seringan mungkin dan ada hanya untuk menyediakan koneksi ke DB, kadang-kadang diabstraksikan sehingga backend DB yang berbeda dapat digunakan.

Lapisan layanan ada untuk memberikan logika untuk beroperasi pada data yang dikirim ke dan dari DAO dan klien. Sangat sering 2 buah ini akan digabungkan bersama ke dalam modul yang sama, dan kadang-kadang ke dalam kode yang sama, tetapi Anda masih akan melihatnya sebagai entitas logis yang berbeda.

Alasan lain adalah keamanan - Jika Anda memberikan lapisan layanan yang tidak ada hubungannya dengan DB, maka apakah lebih sulit untuk mendapatkan akses ke DB dari klien kecuali melalui layanan. Jika DB tidak dapat diakses langsung dari klien (dan tidak ada modul DAO sepele bertindak sebagai layanan) maka semua penyerang yang telah mengambil alih klien dapat melakukan upaya meretas lapisan layanan juga sebelum ia mendapatkan semua kecuali sebagian besar akses sanitasi ke data Anda.

gbjbaanb
sumber
1
Saya setuju dengan pemisahan layanan dan lapisan dao dan lapisan layanan Anda yang berisi logika bisnis Anda.
Peter Delaney
belum lagi bahwa 1 layanan mungkin memanggil beberapa DAO, misalnya saat menyimpan pengguna Anda dapat berbicara dengan UserDao, UserOrdersDao, dll. Atau haruskah kita membuat satu layanan untuk masing-masing? Lalu siapa yang bisa memanggil semua layanan ini?
Fermin Silva
40

Saya penulis posting yang bersangkutan. Saya mendapat bagian yang adil untuk mengerjakan berbagai teknologi dan arsitektur yang berbeda. Berdasarkan di atas, saya dapat dengan aman mengatakan bahwa memiliki lapisan layanan dan lapisan dao selalu merupakan ide yang baik. DAO harus dibatasi hanya untuk menambah / memperbarui / memasukkan / memilih objek Entitas ke / dari database dan itu saja. Jika Anda ingin melakukan sesuatu yang ekstra dalam hal logika, tambahkan ke lapisan layanan. Ini akan membantu dalam membuat kode modular dan mudah diganti ketika basis data diganti (untuk beberapa bagian data). Ini berlaku khusus dalam aplikasi yang melibatkan laporan yang memiliki logika berat bahkan setelah mengambil data dari database.

Selain itu, pada musim semi, keamanan diterapkan pada lapisan layanan idealnya. Anda tidak ingin mengubah cara ini.

lokesh
sumber
5
Hai, terima kasih banyak telah menjawab pertanyaan saya; itulah dedikasi untuk blog Anda! Terima kasih atas contoh yang bagus, terus menulis.
Jeff
Ini mengganggu pikiran saya selama beberapa waktu dan saya pikir pengalaman paling membantu dalam situasi ini. Terima kasih.
Utku Özdemir
Saya setuju dengan pemisahan layanan dan lapisan dao dan lapisan layanan Anda yang berisi logika bisnis Anda dan hanya akan memanggil metode Dao. Bagaimana ketika salah satu metode layanan saya perlu memanggil metode layanan lain. Haruskah saya memiliki abstraksi lain di atas lapisan layanan yang memanggil beberapa metode layanan?
Peter Delaney
Kelas di lapisan layanan dapat memiliki referensi satu sama lain (sesuai kebutuhan) dan mereka dapat memanggil metode yang diperlukan.
lokesh
11

Adam Bien menunjukkan dalam bukunya fakta bahwa EntityManager JPA adalah implementasi universal yang baik dari DAO:

http://realworldpatterns.com/

Di dunia Java EE hampir tidak pernah ada kebutuhan untuk menulis DAO Anda sendiri karena implementasi JPA menyertakannya. Anda hanya perlu menulis lapisan layanan.

Menerapkan lapisan DAO Anda sendiri adalah benar-benar mabuk dari arsitektur J2EE yang sangat buruk 15 tahun yang lalu, tetapi banyak orang masih merasa terdorong untuk melakukannya. Lapisan DAO kustom ini sering menyediakan tidak lebih dari fungsi penerusan yang memanggil metode yang sesuai pada EntityManager.

Jadi untuk menjawab pertanyaan Anda, ya Anda membutuhkan lapisan layanan dan DAO, tetapi Anda hanya perlu menulis lapisan layanan.

Dean Schulze
sumber
2
Saya tidak yakin apakah itu berlaku untuk Musim Semi - selalu ada DAO khusus yang perlu dibuat untuk Model. Mungkin pernyataan Anda "hampir tidak pernah perlu menulis DAO Anda sendiri" berlaku khusus untuk server EJB / server aplikasi?
Don Cheadle
1
Lebih baik menulis sendiri (DAO / DAOImpl), meskipun hanya akan memetakan ke EntityManager - Itu karena di masa depan Anda dapat menambahkan implementasi DAO lain tanpa perlu mengubah kode lapisan layanan .
ahmednabil88
@YajliMaclo apa bedanya apa yang harus diubah?
Alex78191
4

Saya biasanya memasukkan semua kode spesifik db (permintaan) dalam DAO dan penanganan transaksi serta logika bisnis dalam layanan. Hal ini memungkinkan metode layanan untuk memanggil metode di beberapa dao dan menyimpannya dalam transaksi yang sama. Menurut pendapat saya, ini memungkinkan untuk menggunakan kembali kode yang lebih baik di dao.

sbrattla
sumber
2

Saya telah menemukan bahwa lapisan layanan menambahkan kompleksitas yang tidak perlu dalam kebanyakan kasus. Secara teori adalah untuk menghindari memiliki logika bisnis di lapisan dao tetapi pada akhirnya ini hanya menyebabkan kebingungan, bahkan beberapa orang telah tidak digunakan untuk menghapus sepenuhnya lapisan dao karena mereka merasa itu tidak menambah nilai. http://ayende.com/blog/4784/architecting-in-the-pit-of-doom-the-evils-of-the-repository-abstraction-layer

Tetapi jika Anda memiliki beberapa logika bisnis maka ya. Itu adalah ide yang bagus. Seberapa penting untuk membuat lapisan layanan?

Yesus
sumber
3
Saya sudah membaca posting blog Ayende berkali-kali sekarang, dan tidak bisa menghilangkan perasaan bahwa desainnya (yang saya akan setujui pada satu titik), sementara setia pada semangat YAGNI, hampir pasti akan membutuhkan lebih banyak waktu dev bahkan di jangka menengah daripada biayanya untuk mengatur abstraksi lapisan di tempat pertama. Saya bertanya-tanya apakah dia telah mengubah pendapatnya tentang penggabungan ketat antara seluruh aplikasi dan NHibernate sekarang karena itu bahkan lebih umum untuk satu aplikasi untuk meminta beberapa sumber data SQL, NoSQL dan API.
Mr Cochese
@LennyGodber ya, saya tahu perasaan Anda IMO lebih baik untuk memiliki lapisan DAO / repositori karena karena memiliki lebih banyak keuntungan yang merugikan karena seperti yang Anda katakan, sangat umum untuk memiliki banyak sumber data
Jesus
-1

IMHO lapisan Layanan dapat dianggap sebagai lapisan antara pengontrol dan lapisan DAO. Lapisan layanan ini persis di mana kita dapat menambahkan logika bisnis dan bahkan membuat objek kembali yang spesifik untuk apa yang perlu dirender oleh tampilan.

compserve23
sumber