c# – ViewModel最终成为Model的副本 – 哪里有好处?

在这里问的另一个问题为我打开了一堆虫子.目前我开发了我的MVC应用程序,模型代表我的数据,并使用脚手架从这些模型生成我的ViewControllers.如果模型没有所需的信息,我使用部分视图来显示相关信息.经过一番阅读后,我现在理解viewmodel是更好的做事方式.所以我的理解是,对于每个视图,我将有一个特定的viewmodel,它返回该视图的数据.

我有两个模型,一个代表一个项目,另一个,项目选项可能有多个.

public class Item
{
    public int ItemId { get; set; }
    public bool Active { get; set; }
    public string ItemCode { get; set; }
    public string Name { get; set; }
    public List<ItemOption> ItemOptions { get; set; }
    //...
}

public class ItemOption
{
    public int ItemOptionId { get; set; }
    public string Name { get; set; }
    public string Barcode { get; set; }
    //...
}

因此,我假设我的ItemDetailviewmodel将只包含我在视图中向用户显示的信息:

public class ItemDetailviewmodel
{
    public bool Active { get; set; }
    public string ItemCode { get; set; }
    public string Name { get; set; }
    public List<ItemOption> ItemOptions { get; set; }
}

我应该在ItemDetailviewmodel上创建我的ItemOptions列表吗?例如它应该是:

public List<ItemOptionsviewmodel> ItemOptions { get; set; }

我想我错过了viewmodel的好处.我已经读过,因此我们可以将一个类中的所有数据都与该视图相关,因此我们可以保持视图的强类型.但是我似乎只是将我的模型复制到我的viewmodel中,所以并没有真正获得任何好处.

另外,我的研究让我想到了AutoMapper是最好的前进方式.我是否正确说我只是将以下内容放入我的启动配置中:

Mapper.CreateMap<Item,ItemDetailviewmodel>()
            .ForMember(x => x.Active,o => o.MapFrom(s => s.Active))
            .ForMember(x => x.ItemCode,o => o.MapFrom(s => s.ItemCode))
            .ForMember(x => x.Name,o => o.MapFrom(s => s.Name));
            .ForMember(x => x.ItemOptions,o => o.MapFrom(s => s.ItemOptions));

如果我这样做,它如何为编辑视图工作.如果我将它们保存回ItemDetailviewmodel,它会在EF中更新我的数据库吗?

解决方法

有利的时候使用视图模型.如果您的域模型已经具有完全相同的属性和验证规则以及与您的视图模型相对应的此特定视图的错误消息,那么很明显您可以重用域模型而不需要声明视图模型.但根据我的经验,这种情况很少发生.或者如果是这种情况,那么您可能会开始问自己为什么您的域模型如此耦合到视图.我的意思是特定于视图的错误消息不应该是域模型的一部分.

所以你应该一直找到合适的平衡点.拥有主视图模型是很常见的,该模型聚合(作为属性)一个或多个域模型.

作为AutoMapper配置中的旁注,如果每个属性具有相同的名称,则无需映射它们.这就是为什么框架被称为AutoMapper,因为它按惯例工作.您问题中显示的所有这些长映射代码等同于更简单的Mapper.CreateMap< Item,ItemDetailviewmodel>();.

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...