仍在使用我的第一个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();
}
}
}
我的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中。如果我忘了怎么办?我可以实现ICloneable但我觉得这对我所有的实体来说都是一个真正的开销。
那么这里的正确模式是什么?更新视图模型管理的记录的最佳方法是什么?
非常感谢, 于连
答案 0 :(得分:0)
你必须在app上使用Repository模式。然后你可以完全将你的DAL层与ViewmModel解耦。在服务层你可以使用AutoMapper将ViewModel映射到Entity,反之亦然。此时你可以做到在你的服务层上。但你必须为Repository模式(即DAL)引入单独的层与依赖注入。然后你不必担心VM和实体的混合。换句话说,那些在2上如果您实现上述模式,则单独的图层
因此,您使用EF核心,可以使用Autofac作为DI API。
什么是AutoMapper?
AutoMapper是一个简单的小型库,用于欺骗性地解决问题 复杂的问题 - 摆脱映射一个对象的代码 另一个。这种类型的代码相当沉闷,写起来很无聊,所以 为什么不为我们发明一个工具?
以下是链接:AutoMapper
好文章:Generic Repository and Unit of Work Pattern, Entity Framework,Autofac
正如 @Sean Stayn 所示,你可以使用Prism。也可以看到。
Prism是一个构建松散耦合,可维护和 WPF,Windows 10 UWP和Xamarin Forms中可测试的XAML应用程序。