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

Jul*_*aro 6 c# mvvm entity-framework-core uwp

仍在使用我的第一个UWP/MVVM/EF Core应用程序.

我不希望我的viewmodels对DbContext有任何了解.所以我创建了以下ItemService类,注入到我的视图模型中.

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

我的ItemViewModel包含以下命令:

public RelayCommand SaveCommand { get; private set; }

private async void Save()
{
    if (!SaveCommand.CanExecute(Item))
        return;

    await ItemService.SavAsync(Item);
}
Run Code Online (Sandbox Code Playgroud)

保存项目时这很有用.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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我只是不喜欢这个解决方案!我必须将item的所有属性复制到dbItem中.如果我忘了怎么办?我可以实现ICloneable但我觉得这对我所有的实体来说都是一个真正的开销.

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

非常感谢Julien

Sam*_*ath 0

您必须在应用程序上使用存储库模式。然后您可以将 DAL 层与 ViewmModels 完全解耦。在服务层上,您可以使用 AutoMapper 将 ViewModel 映射到实体,反之亦然。此时您可以在服务上执行此操作但是您必须通过依赖注入为存储库模式(即 DAL)引入单独的层。然后您无需担心虚拟机和实体的混合。换句话说,如果您实现,那么它们位于 2 个单独的层上以上图案。

因此,您使用 EF core,可以使用Autofac作为 DI API。

什么是自动映射器?

AutoMapper 是一个简单的小库,旨在解决一个看似复杂的问题 - 摆脱将一个对象映射到另一个对象的代码。这种类型的代码写起来相当沉闷和无聊,那么为什么不发明一个工具来为我们做这件事呢?

这是链接:AutoMapper

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

正如@Sean Stayn所建议的,您可以在其中使用Prism。也请参阅。

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