Secara arsitektur, apakah lapisan abstraksi basis data, seperti Microsoft's Entity Framework, membatalkan kebutuhan akan Lapisan Akses Data yang terpisah?


11

Seperti itu

Selama bertahun-tahun, saya telah mengatur solusi perangkat lunak saya sebagai berikut:

  • Data Access Layer (DAL) untuk abstrak bisnis mengakses data
  • Business Logic Layer (BLL) untuk menerapkan aturan bisnis ke set data, menangani otentikasi, dll.
  • Utilitas (Util) yang hanya merupakan perpustakaan dari metode utilitas umum yang telah saya bangun dari waktu ke waktu.
  • Lapisan Presentasi yang tentu saja bisa web, desktop, seluler, apa pun.

Seperti sekarang

Selama empat tahun terakhir ini saya telah menggunakan Microsoft's Entity Framework (saya didominasi oleh .NET dev) dan saya menemukan bahwa memiliki DAL menjadi lebih rumit daripada bersih karena fakta bahwa Entity Framework telah melakukan pekerjaan yang DAL saya dulu lakukan: itu abstrak bisnis menjalankan CRUD terhadap basis data.

Jadi, saya biasanya berakhir dengan DAL yang memiliki kumpulan metode seperti ini:

public static IQueryable<SomeObject> GetObjects(){
    var db = new myDatabaseContext();
    return db.SomeObjectTable;
}

Kemudian, di BLL, metode ini digunakan sebagai berikut:

public static List<SomeObject> GetMyObjects(int myId){
    return DAL.GetObjects.Where(ob => op.accountId == myId).ToList();
}

Ini adalah contoh sederhana tentu saja karena BLL biasanya memiliki beberapa garis logika yang diterapkan, tetapi sepertinya sedikit berlebihan untuk mempertahankan DAL untuk cakupan yang terbatas.

Bukankah lebih baik meninggalkan DAL dan menulis metode BLL saya seperti itu:

public static List<SomeObject> GetMyObjects(int myId){
    var db = new myDatabaseContext();
    return db.SomeObjectTable.Where(ob => op.accountId == myId).ToList();
}

Saya sedang mempertimbangkan untuk membatalkan DAL dari proyek-proyek masa depan karena alasan-alasan yang disebutkan di atas, tetapi sebelum melakukannya, saya ingin memberikan polling kepada masyarakat di sini untuk tinjauan balik / pandangan jauh ke depan Anda sebelum saya memulai proyek dan menemukan masalah yang tidak saya ketahui. t mengantisipasi.

Pikiran apa pun dihargai.

Memperbarui

Tampaknya konsensus bahwa DAL terpisah tidak diperlukan tetapi (membuat kesimpulan saya sendiri di sini) adalah ide yang baik untuk menghindari vendor mengunci. Misalnya, jika saya memiliki DAL yang abstrak panggilan EF seperti yang digambarkan di atas, jika saya pernah beralih ke beberapa vendor lain saya tidak perlu menulis ulang BLL saya. Hanya pertanyaan dasar di DAL yang perlu ditulis ulang. Karena itu, saya merasa sulit membayangkan sebuah skenario di mana ini akan terjadi. Saya sudah dapat membuat model EF dari Oracle db, MSSQL diberikan, saya cukup yakin bahwa MySql juga dimungkinkan (??) jadi saya tidak yakin apakah kode tambahan akan memberikan ROI yang berharga.


3
Apa perbedaan lapisan akses data Anda dengan EF? Bukankah EF lapisan akses data? Satu-satunya alasan yang saya lihat untuk menjaga abstraksi Anda sendiri di antara logika bisnis Anda dan EF adalah untuk membuat stubbing lebih mudah untuk pengujian dan untuk menghindari vendor mengunci.
Marjan Venema

2
Itu maksud saya - tidak ada perbedaan dalam pandangan saya, tetapi saya mencari poin tandingan. Terima kasih.
Matt Cashatt

3
Secara pribadi saya tidak melihat alasan untuk membuat DAL yang terpisah, karena EF / NHibernate adalah lapisan akses data di dalamnya. Seperti yang disebutkan Marjan, dengan EF Anda dapat mempertimbangkannya jika Anda dapat melihat perubahan vendor database, di NHibernate Anda dapat bertukar driver dalam satu baris kode (bahkan driver SQLite untuk pengujian dalam memori), jadi kode (IMO) tidak perlu.
Patryk Ćwiek

3
Tidak perlu memiliki dua DAL. Seperti yang dinyatakan orang lain, simpan BLL Anda, tetapi berhati-hatilah untuk tidak mengunci BLL Anda ke dalam konstruksi khusus vendor. Saya selalu suka melihat hal-hal turun ke tingkat string atau integer. Kemudian saya tahu bahwa saya dapat dengan mudah mengekspos seluruh persimpangan BLL / DAL di saluran yang sangat primitif seperti layanan web, port serial, tautan telegraf, hanya bercanda.
Andyz Smith

1
Pembaruan ulang: lapisan tambahan ini dapat membuat Unittests dari busineslayer lebih mudah karena mengejek / mematikan / memalsukan GetMyObjects(int myId)lebih mudah daripada mengejek / mematikan / memalsukan GetObjects.Where(ob => op.accountId == myId).ToList().
k3b

Jawaban:


6

Tidak yakin apakah ini jawaban yang Anda cari .. tapi begini saja.

Kami melakukannya untuk menjaga hal-hal terpisah / terorganisir. Ya, EF / NHibernate adalah akses data .. tetapi kami membatasi penggunaannya untuk rakitan sendiri dengan pengaturan repositori umum. Majelis ini juga berisi semua pemetaan NHibernate kami, pabrik Session, kode untuk menangani banyak basis data, dll.

Kami masih menyebutnya sebagai "Lapisan Akses Data", karena seluruh unit ada untuk mendukung ORM kami.

Saya mungkin harus mencatat bahwa referensi aplikasi utama kami 5 database, memiliki sekitar 4-500 objek domain / pemetaan dan berbagai skema. Jadi, pengaturan ini masuk akal bagi kami. Mungkin untuk aplikasi yang lebih kecil Anda akan melewati majelis ini tapi .. Saya payah untuk kode yang terorganisir dan mungkin akan tetap melakukannya :)


2

Saya melihat EF dan DAL sebagai komponen terpisah dalam sistem Perusahaan. Layer Akses Data adalah abstraksi yang digunakan layanan lain untuk melakukan kegigihan dan manajemen data. Biasanya, Entity Frameworks membangun API yang bagus seputar kueri, memperbarui, menghapus, dan menyisipkan pada intinya mereka masih membutuhkan koneksi langsung ke sumber data back-end. Jadi segala jenis perutean atau firewall akan menghentikan EF dari bekerja, sehingga mengharuskan Anda untuk membuat komponen mediasi EF.

Berikut adalah contoh tingkat tinggi yang menunjukkan di mana DAL dan EF cocok:

-------------    -------                                    ----------------    ------
| Service A | -> | DAL | -> { LOCAL / LAN / WAN ACCESS } -> | DAL BACK-END | -> | EF |
-------------    -------                                    ----------------    ------

Sudah pengalaman saya bahwa desain yang lebih baik adalah untuk tidak pernah membiarkan logika bisnis atau implementasi layanan akses langsung ke lapisan EF. Sebaliknya, untuk memberikan abstraksi untuk bekerja dengan semua data persisten yang memungkinkan Anda untuk mengirim permintaan melalui kabel atau melakukannya secara lokal.

Desain ini memperkenalkan beberapa abstraksi bocor. Jadi harus dipertimbangkan berdasarkan kasus per kasus.

Beberapa pertanyaan untuk diajukan:

  • Apakah semua komponen yang mengakses data Anda dapat memperoleh Koneksi ke penyimpanan data back-end?
  • Apakah EF Anda memungkinkan Anda untuk mengumpulkan kumpulan data di berbagai jenis penyimpanan data? Misalnya menggunakan database SQL dengan MongoDB untuk dokumen.

1

Saat ini pertanyaan tentang apakah Anda akan mengubah penyimpanan data atau tidak lebih menarik daripada sebelumnya, karena pertanyaannya mungkin bukan hanya apakah Anda akan bertukar atau tidak antara MS SQL atau Oracle SQL, tetapi pertanyaan yang lebih besar adalah apakah Anda dapat digunakan pada berbagai penawaran penyimpanan data NoSQL sebagai repositori data Anda.

Jika ada kemungkinan serius dari perubahan semacam itu, mungkin berharga untuk menjaga kode EF Anda tetap di dalam DAL Anda sehingga Anda bisa memperkenalkan DAL baru di masa depan yang memetakan permintaan repositori Anda ke database NoSQL. Mungkin saja perubahan seperti itu akan berakhir dengan penulisan ulang grosir BLL Anda karena asumsi terkait db yang merayap masuk tentu saja.

Demikian pula, EF dalam DAL mungkin akan membuat mengejek akses data untuk tes unit kode BLL Anda lebih mudah.

Jadi pandangan saya adalah EF (atau ORMS lainnya) tidak serta merta menghilangkan kebutuhan akan lapisan akses data.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.