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.
GetMyObjects(int myId)
lebih mudah daripada mengejek / mematikan / memalsukanGetObjects.Where(ob => op.accountId == myId).ToList()
.Jawaban:
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 :)
sumber
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:
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:
sumber
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.
sumber