使用 ViewModel 设计 MVC 存储库

2024-04-28

我想创建一个存储库类来将我的数据逻辑与控制器分开。我使用 ViewModel 来表示一些数据,这些数据将填充来自不同表的数据。

我有一些问题:

  1. 对于像这样的方法GetAll(),我要返回一个IQueryable<MyViewModel> or IQueryable<Entity>?如果我返回视图模型,我该如何处理GetAll()提取数千条记录?
  2. 我是否为自定义 ViewModel 类创建一个构造函数,该构造函数将实体作为参数来进行映射? (我仍然不熟悉自动映射器,所以只需要从设计的角度了解如何做到这一点)

同样,我主要关心的是像这样的方法GetAll()这将打破许多记录。如果我执行 foreach 循环将每个实体转换为 ViewModel 似乎会产生很大的开销。我的想法是在自定义 ViewModel 类中放置一个引用IQueryable<Entity>从集合中访问,并让 ListViewModel 只有索引器或类似引用集合属性的东西。


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 看起来开销很大。

别担心这个。拉取记录将比循环和映射到视图模型慢得多。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ViewModel 设计 MVC 存储库 的相关文章

随机推荐