gpt4 book ai didi

asp.net-mvc - 使用 ViewModel 设计 MVC 存储库

转载 作者:行者123 更新时间:2023-12-04 11:56:14 25 4
gpt4 key购买 nike

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

以下是我的一些问题:

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

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

    最佳答案

    1) For a method like GetAll(), do I return an IQueryable or IQueryable? If I return viewmodels, how do I cope with a GetAll() that pulls thousands of records?


    IQueryable<Entity> .存储库不处理 View 模型。将存储库视为在单独的类库中定义的东西,它不引用您的 View 模型所在的 ASP.NET MVC 应用程序。引用此库的是 ASP.NET MVC 应用程序。

    2) Do I create a constructor for my custom ViewModel class that takes the Entity as a parameter to do the mapping? (I'm still unfamiliar with automapper so just need an understanding on how to do this from a design point of view)



    不。不要在 View 模型中创建构造函数,特别是如果您希望 Controller 操作将这些 View 模型作为操作参数(想想 POST 操作)。原因是默认模型绑定(bind)器将不再知道如何实例化您的 View 模型,您将不得不编写自定义模型绑定(bind)器。

    所以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 事件来拉取传递给 View 的域模型,使用 AutoMapper 将其映射到 View 模型并用 View 模型替换模型,您可以进一步简化重复代码:
    [AutoMap(typeof(IEnumerable<Entity>), typeof(IEnumerable<MyViewModel>))]
    public ActionResult SomeAction()
    {
    IEnumerable<Entity> entities = Repository.GetAll();
    return View(entities);
    }

    Again, my main concern is a method like GetAll() which would pull many records. If I did a foreach loop to translate each Entity into a ViewModel seems like a lot of overhead.



    不要担心那个。提取记录将比循环和映射到 View 模型慢一个数量级。

    关于asp.net-mvc - 使用 ViewModel 设计 MVC 存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11943210/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com