C# 将模型映射到视图模型

C# 将模型映射到视图模型,c#,.net,asp.net-mvc,model-binding,dto,C#,.net,Asp.net Mvc,Model Binding,Dto,我正在看一个指南,上面说“应该使用automapper将模型映射到视图模型。”为什么要这样做 为什么不让模型成为视图模型的一个属性呢?例如,我可以使用如下视图模型对联系人列表进行分页: class ContactListPaginatedViewModel { public Contact myContact; //the model object public PageInfo pageInfo; } 即使我需要一个帖子回更新联系信息-模型绑定器将很容易解决这个问题。如果我

我正在看一个指南,上面说“应该使用automapper将模型映射到视图模型。”为什么要这样做

为什么不让模型成为视图模型的一个属性呢?例如,我可以使用如下视图模型对联系人列表进行分页:

class ContactListPaginatedViewModel {
    public Contact myContact;  //the model object
    public PageInfo pageInfo;
}
即使我需要一个帖子回更新联系信息-模型绑定器将很容易解决这个问题。如果我需要从绑定中省略某些字段/属性(通过回发或其他方式),那么我可以简单地使用带有“包含/排除”的绑定注释

是否有一些更大的问题我遗漏了,这将建议手动映射过程(其中模型的所有属性都在视图模型上复制)是可取的

我能想到的最好情况是,模型可能有几十个视图(或视图模型)不需要的属性……但即使在这种情况下,上述指导仍然没有意义


洞察?

通常,如果您有一个dto类,最好的做法是提供一个视图模型,其中只包含模型所需的属性。这意味着您实际上只为实际使用的对象指定属性,例如,我有一个包含20个字段的
客户端
对象,我需要
Id
全名
,如果在模型中包含整个
客户端
对象,那就太过分了,最好只在该模型中指定所需的属性


另外,从架构的角度来看,您真的想向视图公开DTO类吗?在大多数情况下,某种类型的服务层被用作DTO类和视图本身之间的临时通信点,这反过来会为您填充视图模型。

因为直接将数据实体发送到视图是不好的做法。原因有很多,包括安全方面的原因。但也有更实际的原因,比如能够应用视图模型属性(当实体自动生成时,这是无法做到的,尽管有一些方法可以解决这一问题,例如使用buddy类)


总的来说。您需要特定于视图的视图模型。此视图模型应映射到您的业务对象。业务对象是否不同于实体对象更像是一个灰色区域,但视图模型和业务模型之间应该有明确的区别。

我几乎总是在视图模型中保留模型引用。如果我需要一些额外的属性,我只需将它们添加到我的viewmodel中。我觉得很好