从视图模型更新记录的正确方法是什么?

本文关键字:方法 是什么 视图 模型 更新 新记录 | 更新日期: 2023-09-27 18:09:24

还在做我的第一个UWP/MVVM/EF Core应用。

我不希望我的视图模型有DbContext的任何知识。因此,我创建了下面的ItemService类,并将其注入到我的视图模型中。

public class ItemService : IItemService
{
    public async Task SaveAsync(Item item)
    {
        using (var db = new MyDbContext())
        {
            db.Items.Add(item);
            await db.SaveChangesAsync();
        }
    }
}

我的ItemViewModel包含以下命令:

public RelayCommand SaveCommand { get; private set; }
private async void Save()
{
    if (!SaveCommand.CanExecute(Item))
        return;
    await ItemService.SavAsync(Item);
}

当我保存一个项目时,这非常有效。SaveAsync方法创建DbContext的新实例,添加刚刚创建的项,然后将更改提交到数据库。

我的问题是关于更新现有记录。我想过这样的事情:

public class ItemService : IItemService
{
    public async Task UpdateAsync(Item item)
    {
        using (var db = new MyDbContext())
        {
            Item dbItem = (from i in db.Items
                           where i.Id = item.Id
                           select i).FirstOrDefault();
            // Here I should duplicate all the item's properties into dbItem ones
            await db.SaveChangesAsync();
        }
    }
}

我就是不喜欢这个解决方案!我必须将item的所有属性复制到dbItem中。如果我忘了怎么办?我可以实现iclonable,但我发现这是一个真正的开销为我所有的实体。

那么这里正确的模式是什么呢?更新由视图模型管理的记录的最佳方法是什么?

提前感谢,朱利安

从视图模型更新记录的正确方法是什么?

你必须在你的应用程序上使用Repository模式。然后你可以完全从ViewmModels中解耦你的DAL层。在服务层,您可以使用AutoMapper将ViewModel映射到Entity,反之亦然。现在你可以在你的Service层上做。但是,您必须通过依赖注入为存储库模式(即DAL)引入单独的层。然后你就不需要担心虚拟机和实体的混合。换句话说,如果你实现上面的模式,它们是在两个独立的层上。

因此你正在使用EF core,你可以使用Autofac作为DI API。

什么是AutoMapper?

AutoMapper是一个简单的小库,用于解决欺骗性的复杂的问题-摆脱将一个对象映射到的代码另一个地方。这种类型的代码编写起来相当枯燥乏味,所以为什么不发明一个工具来帮我们做呢?

AutoMapper

好文章:通用存储库和工作单元模式,实体框架,Autofac

根据@Sean Stayn的建议,您可以使用Prism

Prism是一个框架,用于构建松散耦合的、可维护的和可测试的XAML应用程序在WPF, Windows 10 UWP和Xamarin表单。