Saya telah melihat sedikit ini dan belum menemukan solusi "sempurna". Pola repositori bekerja sangat baik untuk aplikasi MVC di mana konteksnya berumur pendek karena ada dalam controller yang berumur pendek, tetapi masalah terjadi ketika Anda mencoba menerapkan struktur yang sama ke aplikasi WPF di mana VM dapat bertahan untuk jangka waktu yang lama.
Saya telah menggunakan solusi ini di masa lalu yang jauh lebih sederhana daripada banyak pola repo saya telah melihat bahwa upaya untuk mengabstraksi hal-hal ke jumlah yang ekstrem, menghasilkan jumlah kode yang hampir tidak terbaca yang sulit untuk di-debug. Berikut langkah-langkahnya ...
- Buat proyek terpisah untuk EDMX untuk bertindak sebagai lapisan akses Data Anda
- Buat folder "Repositori" di bawah proyek yang sama
Buat kelas dasar "BaseRepository" untuk bertindak sebagai "Unit Kerja". IDisposable
akan memungkinkan Anda untuk menggunakan ini dalam using(){}
dan partial
akan memungkinkan Anda menerapkan repositori lainnya
public partial class MyEntityRepository : IDisposable
{
MyEntities context = new MyEntities();
public void Dispose()
{
context.Dispose();
}
}
Buat file lain yang disebut "MyOtherRepository". buat kelas parsial yang sama tetapi terapkan metode berdasarkan apa yang Anda inginkan file itu mengandung
public partial class MyEntityRepository
{
public void MyOtherMethodSave(EntityObject obj)
{
//work with context
...
context.SaveChanges();
}
}
Sekarang di VM Anda, Anda dapat melakukan ini ...
using(MyEntityRepository repo = new MyEntityRepository())
{
repo.MyOtherMethodSave(objectToSave);
}
Ini mengelompokkan semua repositori Anda dalam satu kelas sehingga Anda tidak harus berurusan dengan konteks yang terpisah. Ini memungkinkan Anda mengelola repo yang berbeda dengan mengelompokkan metode ke dalam file yang berbeda dan membantu mencegah duplikasi kode. Di atas semua itu, konteks Anda berumur pendek seperti mereka tanpa menggunakan pola ini.
Kerugiannya adalah bahwa dengan sistem yang lebih besar, Anda mungkin memiliki banyak metode yang dibundel dalam repo Anda. Salah satu solusi dalam hal ini adalah dengan mengimplementasikan beberapa perintah umum dasar seperti "Find" atau "Add", dan mengimplementasikan yang khusus dalam repositori masing-masing.