Saya sedang membangun aplikasi WPF yang mengimplementasikan fitur-fitur berikut:
- Ambil input pengguna dan baca data dari basis data
- melakukan beberapa perhitungan di atasnya
- Perlihatkan kepada pengguna dalam berbagai jenis tampilan dan tulis perubahan kembali ke db
Arsitektur yang diajukan: Database -> Kerangka Entitas -> Repositori -> Logika Bisnis -> Layanan Data -> ViewModel
Alasan untuk menggunakan arsitektur ini: Beberapa skenario hadir dalam aplikasi (Multiple view) dan beberapa database. Karenanya, saya bersedia menggunakan repositori di tengah untuk abstraksi.
Satu peringatan adalah bahwa konteksnya akan berumur panjang jika repositori diimplementasikan. Untuk mengatasinya, apakah boleh membuat konteks dan membuangnya dalam blok using () di masing-masing metode crud.?
jangan ragu untuk menyarankan pendekatan alternatif.
c#
design
architecture
wpf
Potong langit
sumber
sumber
Jawaban:
Gunakan satu objek DbContext per akses data atau transaksi.
DbContext
adalah benda yang ringan; itu dirancang untuk digunakan sekali per transaksi bisnis. MembuatDbContext
Singleton Anda dan menggunakannya kembali di seluruh aplikasi dapat menyebabkan masalah lain, seperti masalah konkurensi dan kebocoran memori.DbContext
pada dasarnya mengimplementasikan Satuan Kerja. Perlakukan sesuai.Jangan buang objek DbContext.
Meskipun
DbContext
implementasinyaIDisposable
, Anda tidak harus membuangnya secara manual, atau membungkusnya dalamusing
pernyataan.DbContext
mengelola hidupnya sendiri; ketika permintaan akses data Anda selesai,DbContext
secara otomatis akan menutup koneksi database untuk Anda.Untuk memahami mengapa hal ini terjadi, pertimbangkan apa yang terjadi ketika Anda menjalankan pernyataan Linq pada koleksi entitas dari a
DbContext
. Jika Anda mengembalikan pemuatan malasIQueryable
dari metode akses data Anda, Anda berdiri pipa yang sebenarnya tidak dieksekusi sampai klien memaksa beberapa data dari itu (dengan meneleponFirstOrDefault()
,ToList()
atau beralih di atasnya).Bacaan Lebih Lanjut
Apakah saya harus selalu memanggil Buang () pada objek DbContext saya?
Mengapa Anda tidak harus menggunakan Singleton DataContexts di Entity Framework
Returning
IEnumerable<T>
vs.IQueryable<T>
Haruskah Repositori kembali
IQueryable
?sumber
using
blok? Atau apakah saya hanya tidak memikirkan beberapa kasus di mana menggunakan IQueryable seperti yang Anda sarankan akan sepadan dengan masalahnya?DbContext
Bertanggung jawab untuk mengelola masa hidupnya sendiri. Saran saya adalah membiarkannya melakukan itu; itu akan berfungsi apakah Anda menggunakanIQueryable
atauIEnumerable
. Kasus penggunaan yang paling jelas yang dapat saya pikirkan untuk pemuatan malas adalah di mana Anda mengembalikan beberapa objek ViewModel dengan koleksi terkait di dalamnya, tetapi koleksi tersebut tidak pernah digunakan (atau hanya digunakan sebagian).IQueryable
memungkinkan Anda untuk menghindari biaya pengambilan catatan yang tidak digunakan.Idealnya konteks harus diinisialisasi dan diakhiri untuk satu transaksi. Dalam kasus Anda konteksnya harus dipakai di Business Logic dan diteruskan ke Repositori untuk membaca / menulis data.
sumber
Jika Anda memanggil DbContext pada setiap metode dalam aplikasi Anda, Anda akan mengalami kebocoran memori. Gunakan satu instance dari DbContext. Lihat komentar pada contoh di bawah ini:
sumber