Apakah ini desain yang buruk? Bagaimana itu bisa diperbaiki?

9

Saya menulis berikut ini beberapa waktu lalu, tapi saya datang untuk memeriksanya baru-baru ini, dan sekarang tidak berpikir itu desain yang bagus.

Desainnya adalah untuk semacam lapisan basis data modular menggunakan Entity Framework 4. Ada objek database tunggal yang memuat (lazy) konteks kerangka entitas dari perpustakaan eksternal di lokasi tertentu, dan contoh konteks yang dimuat disimpan dalam tabel hash terhadap nama mereka (EG "ContentMgmtContext").

Semua kontak dengan database dalam sistem ini adalah melalui prosedur tersimpan. Untuk melakukan panggilan ke database, tanda tangan metode kueri terlihat seperti ini:

List<TReturn> Query<TReturn>(string Context, 
                             string Procedure, 
                             TransactionScope Scope, 
                             List<ObjectParameter> QueryParameters)

Modularitas ini adalah sesuatu yang saya sukai. Namun, ada satu kelemahan signifikan terhadap pendekatan ini: when using the database layer, the code using it has to have a reference to the library in which the context is stored, in order to access the types returned by the stored procedures through Entity Framework.Dalam model, objek dari lapisan database diterjemahkan ke objek baru yang digunakan tampilan dan pengontrol.

Saya pikir ini desain yang buruk, tetapi bagaimana saya bisa memperbaikinya? Saya telah mempertimbangkan untuk menambahkan antarmuka kosong seperti IStoredProecedureObjectuntuk memberikan setiap tipe data yang dikembalikan oleh prosedur tersimpan tipe basis umum, namun ini tampaknya digagalkan oleh Entity Framework. Setiap kali .edmxfile dikompilasi ulang, kode dihasilkan lagi, dan penambahan apa pun dihapus. Apakah ada cara untuk menghentikan ini terjadi?

Bagaimana saya bisa meningkatkan desain ini? Apa yang salah dengannya? Atau apakah saya di jalur yang benar?

Andy Hunt
sumber

Jawaban:

6

Penafian: Saya tidak menggunakan kerangka entitas dan sangat bias terhadap hampir semua kerangka kerja pembantu database.

Sepertinya Anda telah membuat pembungkus.

Saya membuat perbedaan antara "pembungkus" dan "lapisan". Lapisan menjadi sesuatu yang Anda dapat kompilasi untuk itu sendiri DLL / proyek / Jar / apa pun. Lapisan akses data. Wrapper menjadi kelas "pembantu" yang Anda gunakan dalam DLL itu. Dengan tujuan menyederhanakan antarmuka, atau mungkin menghilangkan duplikasi.

Masalah dengan penyederhanaan antarmuka akses basis data adalah umumnya tidak sederhana. Anda akhirnya menduplikasi antarmuka ADO / JDBC / dll. Atau Anda memaksa orang untuk memotongnya. Pembungkus cenderung melakukan segala macam hal yang tidak diinginkan. Mereka mungkin secara otomatis menutup koneksi ketika Anda membutuhkannya terbuka untuk mendukung transaksi. Mereka sering keliru meninggalkan koneksi terbuka jika Anda harus melakukan streaming data, dan menggunakan salah satu dari bahasa sampah yang dikumpulkan. Untuk memberikan kekuatan penuh perpustakaan di belakang bungkus Anda, Anda terpaksa menduplikasi.

Perpustakaan seperti ADO / JDBC sudah merupakan antarmuka yang HEBAT. Mereka adalah beberapa contoh terbaik OOP yang dilakukan dengan benar. Saya lebih suka menggunakannya di atas pembungkus beberapa wizbang ditarik keluar dari topinya.

Antarmuka gaya JDBC / ADO klasik sudah dikenal dan dipahami. Pembungkus yang kamu tarik dari topimu bukan.

Ingin mengurangi "paramters.Add" yang berlebihan? Lihatlah ke generik. Atau terima saja dengan mencoba mengurangi "paramter.Add" Anda sebenarnya hanya mendorong ".add" ke lapisan kode lain.

BTW ini pertanyaan yang bagus. Saya akan mengulanginya 10 kali jika saya bisa.

Sunting: Tentu saja kode JDBC akan disembunyikan di lapisan akses data.

Tuan Tydus
sumber
Saya setuju, di belakang, bahwa ini lebih merupakan pembungkus EF 4 daripada dirinya sendiri. Gagasan di balik itu adalah untuk memungkinkan potongan-potongan yang berbeda dari konektivitas basis data (seperti model data standar) untuk digunakan kembali sementara juga memiliki satu titik masuk untuk beberapa basis data, masing-masing dengan karakteristik kegunaan kembali. Bungkus basis data ini dikompilasi ke perpustakaan terpisah (bersama dengan logika bisnis lainnya). Bagaimana Anda menyarankan saya mengubah desain saya untuk memperbaikinya?
Andy Hunt
Memberi +1 untuk konten hebat terlepas dari EF Bias Anda ... meskipun EF lebih dari sekadar kerangka pembantu DB. Anda benar tentang dia mencoba membuat pembungkus untuk ini.
SoylentGray