我正在寻找一条指南,上面写着“应该使用automapper将模型映射到视图模型”。为何如此指导?
为什么不让模型成为视图模型的属性?例如,我可以使用这样的视图模型对联系人列表进行分页:
class ContactListPaginatedViewModel {
public Contact myContact; //the model object
public PageInfo pageInfo;
}
即使我需要回复以更新联系信息 - 模型绑定器也能轻松解决这个问题。如果我需要从绑定中省略某些字段/属性(通过post-back或其他方式),那么我可以简单地使用“包含/排除”的Bind注释。
是否存在一些我想要的更大的问题,它会建议手动映射过程(模型的所有属性在视图模型上是否重复)是否可取?
我能想到的最好的是该模型可能具有视图(或视图模型)不需要的许多属性......但即使在这种情况下,上述指导仍然没有意义。
数据分析
答案 0 :(得分:1)
通常,如果您有dto类,最佳做法是提供仅包含模型所需属性的视图模型。这意味着您实际上只为实际使用的内容指定了属性,例如我有一个包含20个字段的Client
对象,我需要Id
和FullName
,它是过度杀死以在模型中包含整个Client
对象,最好只指定该模型中所需的属性。
另外,从架构的角度来看,您真的想要将DTO类暴露给视图吗?在大多数情况下,某种服务层被用作DTO类和视图本身之间的临时通信点,这反过来会为您填充视图模型。
答案 1 :(得分:0)
因为将数据直接发送到视图是不好的做法。这有很多原因,包括安全原因。但是还有更实际的原因,例如能够应用视图模型属性(当你的实体被自动生成时你不能做的事情,虽然有很多方法可以解决这个问题,比如伙伴类)。
总的来说。您需要特定于视图的视图模型。此视图模型应映射到您的业务对象。您的业务对象是否与实体对象不同,更多的是灰色区域,但视图模型和业务模型之间应该有明确的区别。
答案 2 :(得分:0)
我几乎总是在我的ViewModels中保留一个模型引用。如果我需要一些额外的属性,我只需将它们添加到我的viewmodel中。这是很好的IMO。