据我所知,使用视图模型可以使web开发。生活更容易,从某种意义上说,我们可以使用这种方法只显示本地化字符串中所需的属性。我也在mvc3视图模型中使用jquery验证等。
现在我有点怀疑,因为我的webapp中存在真正的瓶颈。查询所有对象(其中20个),如下所示
List<Domain.Property> data = session.Query<Domain.Property>().ToList();
return PropertyViewModel.FromDomainModel(data);
并将Property对象列表发送到我的ViewModel,其中FromDomainModel需要List of Property对象,如下所示
List<PropertyViewModel> dataVm = new List<PropertyViewModel>();
{
foreach (Property p in x)
{
dataVm.Add(new PropertyViewModel(p));
}
return dataVm;
}
现在在同一个班级我正在使用
public PropertyViewModel(Property x)
{
Id = x.Id;
Created = x.Created;
Title = x.Title;
....
Photo = x.Photos.First();
}
但是使用这种方法将对象集合发送到viewmodel,其中返回相同的viewmodel,只返回我需要的几个属性,扼杀(至少对我来说)我实现多个实体加载和持续时间大幅增加。
如果您需要更多信息。请问。
如果您知道更好的解决方案,请分享。
更新 使用域模型时,我加载了20个Entity,当使用上面描述的viewmodel时,会加载67个实体,这会大大降低性能。
答案 0 :(得分:3)
在域模型和视图模型之间的映射中确实会花费额外的时间,但这次将是非常小的,绝对不应该是任何瓶颈。在C#中调用属性设置器是一种非常快速的操作,与数据库调用相比,它几乎可以忽略不计。
因此,请继续使用视图模型,而不必担心这会以某种方式影响应用程序的性能。
答案 1 :(得分:1)
不同的视图会有不同的视图模型。如果视图不需要大量数据,则该视图不应包含在该视图的视图模型中。
同时检查选择N + 1问题,如果您还没有更有效地检索引用实体,请考虑在类和集合上设置批量大小。
答案 2 :(得分:0)
你不应该注意到任何瓶颈因为ViewModel而不是它对你的数据库的调用听起来像一个性能问题,n + 1问题是ORM真正常见的性能问题,你应该检查你的调用次数数据库。 Entity Framework Profiler是一个非常好的EF调试器,它会显示对数据库的调用次数,如果性能不好,它会建议你如何改进它。