gpt4 book ai didi

asp.net-mvc-3 - ASP.NET MVC : Where do you assemble the view model for a view?

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

从内到外,这些是我们的 MVC 应用层:

  • MS SQL/表/ View /存储过程
  • 带有 POCO 生成的 Entity Framework 4.1 (ORM)
  • 存储库
  • 服务(检索)和控制功能(保存)
  • 路由 -> Controller -> Razor View
  • (客户端)带有 Knockout.js(MVVM)的 JQuery Ajax

  • 一切都很好,直到我需要为第 5 步创建一个 ViewModel 来提供 Razor View 和 JSON/Knockout ViewModel:
  • 包含以下字段的所有下拉列表选项和选项的标题
  • Items - 我们发送给客户端的任何内容的数组,这些内容成为 ViewModel

  • 由于 Controller 无法直接访问存储库, 这是否意味着我为每个允许编辑内容的 View 创建了一个服务? 我需要根据需要从存储库中获取 POCO 以及每个字段类型的所有选项。

    为每个 View 创建单独的服务似乎是多余的。例如,一个用于编辑地址的 viewModel 和一个单独的 viewModel 用于编辑同样具有地址的房地产。我们可以有十几个表单来编辑同一个地址 POCO。

    为了让这个问题更容易回答,允许 Controller 直接访问存储库是一个有漏洞的抽象吗?

    最佳答案

    那么,您的 Controller 是否会拥有将 Entity Framework 中的 POCO 转换为单独的 View 模型对象的代码?

    如果是这样,那么您应该将该代码移到一个单独的类中,并遵循单一职责原则。该类是否在“服务层”中取决于您。是否使用 AutoMapper 取决于您。但是这些data mappers不应成为 Controller 逻辑的一部分; Controller 应该尽可能愚蠢。

    好的,现在让我们忽略数据映射问题,假设您始终可以将 POCO 直接用作 View 模型。然后你仍然需要一个服务层,因为它会在

    userService.GetByUserName("bob")

    在你的哑 Controller 中,并通过返回以特定方式实现它
    userRepository.Users.Single(u => u.UserName == "bob")

    将这些放在一起,您的 UserController最终接受 IUserServiceIUserDataMapper依赖关系,并且代码是 super 愚蠢的,根据需要:
    public ActionResult ShowUserPage(string userName)
    {
    var user = userService.GetByUserName(userName);
    var viewModel = userDataMapper.MakeViewModel(user);

    return View(viewModel);
    }

    您现在可以使用两个依赖项的 stub 测试 Controller ,或 stub IUserDataMapper当你 mock 时 IUserService , 或相反亦然。您的 Controller 几乎没有逻辑,而且 has only one axis of change .用户数据映射器类和用户服务类也是如此。

    今天早上我正在阅读一篇文章,你可能会发现它对这些建筑问题有些启发。它有点居高临下地命名为“ Software Development Fundamentals, Part 2: Layered Architecture”。您可能无法从数据库应用程序模型切换到本文描述和建议的持久无知模型。但它可能会为您指明正确的方向。

    关于asp.net-mvc-3 - ASP.NET MVC : Where do you assemble the view model for a view?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6434544/

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