แนวทางปฏิบัติที่ดีที่สุดสำหรับ Mvvm Light และ Entity Framework

ฉันกำลังสร้างแอปพลิเคชัน UWP ใหม่โดยใช้ Mvvm Light และ Entity Framework Core ฉันยังใหม่กับ 2 เทคโนโลยีนี้

ฉันสร้างโมเดลของฉัน: คลาส Article เป็น ObservableObject ธรรมดาที่มีคุณสมบัติ 3 อย่าง: Id, Référence และ Désignation

DbContext ของฉันมีดังต่อไปนี้:

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

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

}

ฉันกำลังมองหาวิธีที่ดีที่สุดในการจัดการ DbContext และมุมมองต่างๆ ของฉัน

จะดีกว่าไหมถ้าสร้าง DbContext หนึ่งรายการสำหรับทั้งแอปพลิเคชัน ฉันไม่ชอบความคิดนั้นเลย

ฉันต้องสร้าง DbContext ในแต่ละ ViewModel หรือไม่ ฉันชอบสิ่งนี้มากกว่า.
เมื่อผู้ใช้แตะสองครั้งที่รายการในมุมมองรายการบทความ ฉันจะนำทางไปยังมุมมองรายละเอียดบทความและส่งบทความไปยังโมเดลมุมมองที่เกี่ยวข้องกับมุมมองรายละเอียดบทความ แต่บทความที่มีอยู่แล้วนี้ไม่เกี่ยวข้องกับ DbContext ของโมเดลมุมมองรายละเอียดบทความ

เป็นไปได้หรือไม่ที่จะสร้างอินสแตนซ์ DbContext เมื่อจำเป็นเท่านั้น ตัวเลือกที่ฉันต้องการ.
สำหรับสิ่งนี้ ฉันจะส่งต่อบทความจากโมเดลมุมมองรายการไปยังโมเดลมุมมองรายละเอียด จากนั้นเมื่อผู้ใช้คลิกบันทึก ฉันจะดำเนินการดังนี้:

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

แน่นอนว่าวิธีนี้ใช้ได้กับบทความใหม่ (แทรก) แต่ไม่ใช่สำหรับบทความที่มีอยู่ (อัปเดต)

ฉันมีปัญหาในการตัดสินใจที่นี่

ขอบคุณมากล่วงหน้าจูเลียน


person Julien Ferraro    schedule 27.06.2016    source แหล่งที่มา
comment
ฉันจะค้นหา CQRS และ Mediatr คุณควรสร้างอินสแตนซ์ในแต่ละครั้งที่คุณใช้ เนื่องจากแต่ละอินสแตนซ์เป็นหน่วยของงาน   -  person Callum Linington    schedule 27.06.2016
comment
ในกรณีนี้ Callum ฉันจะส่งบทความที่แก้ไขในมุมมองของฉันไปยัง DbContext ใหม่เพื่อให้สามารถบันทึกลงในฐานข้อมูลได้อย่างไร   -  person Julien Ferraro    schedule 27.06.2016
comment
หากคุณอ่านเรื่อง MediatR คุณจะสร้างสิ่งที่เรียกว่า class SaveArticleRequest : IRequest<Article> จากนั้นสิ่งนี้จะถูกส่งไปใน MediatR โดยใช้ mediator.SendAsync(new SaveArticleRequest(article)); วิธีนี้คุณจะสร้างเฉพาะคลาสเฉพาะ (SRP) ที่จัดการกับสิ่งเดียวเท่านั้น ซึ่งหมายความว่าคุณสามารถจัดระบบของคุณให้มีรายละเอียดที่ดีเยี่ยมได้ IMHO รูปแบบที่น่าทึ่ง   -  person Callum Linington    schedule 27.06.2016
comment
โพสต์รหัส viewModel ในคำถามของคุณ แล้วฉันจะสร้างคำตอบให้คุณโดยใช้ CQRS   -  person Callum Linington    schedule 27.06.2016
comment
@JulienFerraro หากคุณต้องการสร้างแอปพลิเคชันที่ซับซ้อนขนาดใหญ่ ฉันแนะนำให้คุณใช้ PRISM สำหรับสิ่งนั้น หากคุณสร้าง smth เล็กๆ น้อยๆ คุณก็สามารถใช้อะไรก็ได้ที่คุณต้องการ   -  person tym32167    schedule 28.06.2016


คำตอบ (1)


ในความคิดของฉัน คุณควรซ่อนการดำเนินการจัดเก็บทั้งหมดตามอินเทอร์เฟซ (เช่น IArticleRepo หรือ smth เช่นนั้น) และคุณควรใช้ IoC เพื่อเข้าถึงมัน (หากบางคลาสต้องการทำงานกับ Store ก็จะต้องประกาศ IArticleRepo ในพารามิเตอร์ ctor) นอกจากนี้ ภายในอินเทอร์เฟซนี้ IArticleRepo คุณสามารถยกเลิกการดำเนินการที่จำเป็นด้วย Articles ได้ เช่น IArticleRepo.AddArticle(Article a) หากคุณทำเช่นนั้น คุณสามารถเลือกได้ในภายหลังว่าคุณต้องการสร้าง dbcontext สำหรับการดำเนินการแต่ละรายการหรือไม่ หรือบางทีคุณอาจต้องการทำให้การใช้งาน IArticleRepo เป็นซิงเกิลโทนโดยใช้คอนเทนเนอร์ IoC แต่การตัดสินใจดังกล่าวไม่ควรส่งผลกระทบต่อโค้ดอื่น เป็นตัวอย่างง่ายๆ ในโค้ดของฉัน (ฉันแสดงเฉพาะไฟล์นี้ โครงการทั้งหมดน่าเกลียดและฉันจะเปลี่ยนมัน) https://github.com/tym32167/arma3beclient/blob/master/src/Arma3BE.Client.Libs/Repositories/PlayerRepository.cs#L23

person tym32167    schedule 27.06.2016