我在这里问的另一个问题为我打开了一 jar 蠕虫。目前我正在开发我的 MVC 应用程序,模型代表我的数据并使用脚手架从这些模型生成我的 ViewControllers。在模型中没有所需信息的地方,我使用部分 View 来显示相关信息。经过一些阅读,我现在明白 ViewModel 是更好的做事方式。所以我的理解是,对于每个 View ,我都会有一个特定的 ViewModel 来返回该 View 的数据。
我有两个模型,一个代表一个项目,另一个代表可能有多个项目选项。
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 将只包含我在 View 中向用户显示的信息:
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 的好处。我读过它是为了让我们可以将所有数据放在一个与该 View 相关的类中,因此我们可以保持 View 的强类型。然而,我似乎只是将我的模型复制到我的 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));
如果我这样做,它如何为编辑 View 工作。如果我将它们保存回 ItemDetailViewModel 会更新我在 EF 中的数据库吗?
最佳答案
当有好处时使用 View 模型。如果您的领域模型已经与您的 View 模型具有完全相同的属性和验证规则以及与此特定 View 对应的错误消息,那么很明显您可以重用您的领域模型并且您不需要声明 View 模型。但根据我的经验,这种情况很少发生。或者如果是这种情况,那么您可能会开始问自己为什么域模型与 View 如此耦合。我的意思是特定于 View 的错误消息不应该是域模型的一部分。
所以和往常一样,你应该找到正确的平衡点。拥有一个聚合(作为属性)一个或多个域模型的主 View 模型是很常见的。
作为 AutoMapper 配置中的旁注,如果每个属性具有相同的名称,则不需要映射每个属性。这就是该框架被称为 AutoMapper 的原因,因为它按惯例工作。您的问题中显示的所有这些长映射代码等效于更简单的 Mapper.CreateMap<Item, ItemDetailViewModel>();
。
关于c# - ViewModel 最终成为 Model 的副本 - 好处在哪里?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20828315/