Praktik terbaik Mvvm Light dan Entity Framework Core

Saya membuat aplikasi UWP baru menggunakan Mvvm Light dan Entity Framework Core. Saya baru mengenal 2 teknologi ini.

Saya membuat model saya : kelas Artikel adalah ObservableObject sederhana dengan 3 properti : Id, Référence dan Désignation.

DbContext saya adalah sebagai berikut:

public class UniversalTest1Context : DbContext
{
    public DbSet<Article> Articles { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlite("Filename=UniversalTest1.db");
    }

}

Saya mencari cara terbaik untuk mengelola DbContext dan pandangan saya yang berbeda.

Apakah lebih baik membuat satu DbContext untuk seluruh aplikasi? Saya tidak terlalu menyukai gagasan itu.

Apakah saya harus membuat DbContext di setiap ViewModel? Saya lebih menyukai ini.
Saat pengguna mengetuk dua kali item dalam tampilan daftar artikel, saya menavigasi ke tampilan detail artikel dan meneruskan artikel ke model tampilan yang terkait dengan tampilan detail artikel. Namun artikel yang sudah ada ini tidak terkait dengan DbContext model tampilan detail Artikel.

Apakah mungkin untuk membuat instance DbContext hanya bila diperlukan? Opsi pilihan saya.
Untuk ini, saya meneruskan artikel dari model tampilan daftar ke model tampilan detail. Dan kemudian, ketika pengguna mengklik simpan, saya menjalankan sesuatu seperti ini:

using (var db = new UniversalTest1Context())
{
    db.Articles.Add(article);
    await db.SaveChangesAsync();
}

Tentu saja, ini berfungsi untuk artikel baru (sisipkan), tetapi tidak untuk artikel yang sudah ada (perbarui).

Saya kesulitan mengambil keputusan di sini.

Terima kasih banyak sebelumnya, Julien


person Julien Ferraro    schedule 27.06.2016    source sumber
comment
Saya akan mencari CQRS dan Mediatr. Anda harus membuat sebuah instance setiap kali Anda menggunakannya, karena setiap instance adalah satu unit kerja.   -  person Callum Linington    schedule 27.06.2016
comment
Callum, dalam hal ini, bagaimana cara meneruskan artikel yang diedit dalam tampilan saya ke DbContext baru sehingga dapat disimpan ke database?   -  person Julien Ferraro    schedule 27.06.2016
comment
Jika Anda membaca di MediatR, Anda membuat apa yang disebut class SaveArticleRequest : IRequest<Article> Kemudian ini dikirim ke MediatR menggunakan mediator.SendAsync(new SaveArticleRequest(article)); Dengan cara ini Anda hanya membuat kelas khusus (SRP) yang menangani satu hal. Ini berarti Anda dapat menyusun sistem Anda dengan sangat detail. IMHO pola yang luar biasa.   -  person Callum Linington    schedule 27.06.2016
comment
Posting kode viewModel di pertanyaan Anda dan saya akan membuatkan Anda jawaban menggunakan CQRS.   -  person Callum Linington    schedule 27.06.2016
comment
@JulienFerraro, jika Anda ingin membuat aplikasi besar yang kompleks, saya sarankan Anda menggunakan PRISM untuk itu. Jika Anda membuat sesuatu yang sangat kecil, maka Anda dapat menggunakan apapun yang Anda inginkan.   -  person tym32167    schedule 28.06.2016


Jawaban (1)


Menurut pendapat saya, Anda harus menyembunyikan semua operasi penyimpanan berdasarkan antarmuka (seperti IArticleRepo atau sejenisnya) dan Anda harus menggunakan IoC untuk mengaksesnya (jika beberapa kelas ingin bekerja dengan Store, ia harus mendeklarasikan IArticleRepo dalam parameter ctor). Selain itu, di dalam antarmuka IArticleRepo ini Anda dapat menghapus operasi yang diperlukan dengan Artikel, seperti IArticleRepo.AddArticle(Article a). Jika Anda melakukannya, Anda dapat memilih nanti, apakah Anda ingin membuat dbcontext untuk setiap operasi atau tidak ATAU mungkin Anda ingin menjadikan implementasi IArticleRepo sebagai singletone menggunakan wadah IoC. Namun keputusan seperti itu tidak akan berdampak pada kode lain. Sebagai contoh yang sangat sederhana dalam kode saya (saya hanya menampilkan file ini, keseluruhan proyek jelek dan saya akan mengubahnya) https://github.com/tym32167/arma3beclient/blob/master/src/Arma3BE.Client.Libs/Repositories/PlayerRepository.cs#L23

person tym32167    schedule 27.06.2016