1) 对于像 GetAll() 这样的方法,我返回 IQueryable 还是 IQueryable?如果我返回视图模型,如何处理提取数千条记录的 GetAll() ?
IQueryable<Entity>
。存储库不处理视图模型。将存储库视为在单独的类库中定义的内容,该类库不会引用视图模型所在的 ASP.NET MVC 应用程序。 ASP.NET MVC 应用程序引用了该库。
2) 我是否为自定义 ViewModel 类创建一个构造函数,该构造函数将实体作为参数来进行映射? (我仍然不熟悉自动映射器,所以只需要从设计的角度了解如何做到这一点)
不。不要在视图模型中创建构造函数,特别是如果您希望控制器操作将这些视图模型作为操作参数(考虑 POST 操作)。原因是默认的模型绑定器将不再知道如何实例化您的视图模型,您将不得不编写自定义模型绑定器。
所以AutoMapper还是手动映射。
您可以从手动映射示例开始:
public ActionResult SomeAction()
{
IEnumerable<Entity> entities = Repository.GetAll();
IEnumerable<MyViewModel> model = entities.Select(x => new MyViewModel
{
Prop1 = x.Prop1,
Prop2 = x.Prop2,
...
});
return View(model);
}
一旦你厌倦了编写这段代码,就转向 AutoMapper:
public ActionResult SomeAction()
{
IEnumerable<Entity> entities = Repository.GetAll();
IEnumerable<MyViewModel> model = Mapper.Map<IEnumerable<Entity>, IEnumerable<MyViewModel>>(entities);
return View(model);
}
或者,如果您编写一个自定义操作过滤器,该过滤器使用 OnActionExecuted 事件来拉取传递给视图的域模型,使用 AutoMapper 将其映射到视图模型,并用视图模型替换视图的模型,您可以进一步简化重复代码:
[AutoMap(typeof(IEnumerable<Entity>), typeof(IEnumerable<MyViewModel>))]
public ActionResult SomeAction()
{
IEnumerable<Entity> entities = Repository.GetAll();
return View(entities);
}
同样,我主要关心的是像 GetAll() 这样的方法,它会拉很多
记录。如果我做了一个 foreach 循环将每个实体转换为
ViewModel 看起来开销很大。
别担心这个。拉取记录将比循环和映射到视图模型慢得多。