当前位置: 首页 > 知识库问答 >
问题:

MVC架构DTO/模型映射/转换

南宫浩皛
2023-03-14

使用Spring MVC,我们通常会看到控制器、服务和存储库层。仓库层使用实体模型,实体模型与数据库是一对一的映射。我想过跟着-

  1. 服务层应该使用相同的实体模型吗?
  2. 服务层应该使用单独的域模型吗?如果是,那么到/到来回映射应该在服务层完成?
  3. 控制器层我们应该使用相同的域模型吗?
  4. 控制器层应该使用单独的DTO模型吗?如果是,那么到/来回映射应该在控制器层完成?
  5. 我们有什么简单的方法可以在不写太多冗长代码的情况下进行映射吗?我过去用过几次推土机。

可能有人问过这个问题,但我找不到。所以请原谅我重复的问题。

共有3个答案

宰父飞翼
2023-03-14

在整个服务层中使用的实体模型应该是相同的。根据应用程序的体系结构和复杂性,您可能希望在服务层和控制器层中使用不同的域模型。我的建议是:

  • 服务总是在使用数据库检索和存储的实体上工作
  • 服务总是将DTO或简单类型作为参数,并且只返回DTO。为什么啊?因为DTO是从数据库中分离出来的,您既不会遇到Lazy初始化异常,也不必使用视图中打开会话反模式
  • 将DTO视为服务和控制器之间共享的唯一模型
  • 对于实体和DTO对象之间的映射,我建议使用ModelProjector。它非常简单,精益和留下最小的足迹

ModelProjector简单地通过匹配属性名称将一个模型映射到另一个模型。如果它们不匹配,你可以用注释来告诉它。也可以用非常直接的注释将复杂的实体层次结构映射到“扁平”的数据结构上。实体类保持不变。

华凡
2023-03-14

1)是的,

2) 不,,

3,4)使用entitys进行输出,但使用CommandObjects和DTO(而不是实体)进行输入。这取决于您的体系结构,但如果您不希望客户端对实体的每个字段进行手动上载,则需要将用于请求映射的对象(commandobjects)与域实体分离。

饶曦之
2023-03-14
 类似资料:
  • 我正在为我们班做一个项目。需要将DTO映射到实体,反之亦然。我的DTO没有Id字段,转换正在控制器层进行。另外两个类正在扩展我的实体,因此@Superbuilder。 我的转换实体- 但是DTO- 如果你们谁能帮我找到解决办法,我将不胜感激。提前感谢您的时间和回复。 =======我的DTO===== =====我的实体===== } ====ModelMapper的Bean===== =====

  • 当我尝试通过枚举将源中的字符串映射到目标中的整数时。ModelMapper失败。 来源 目的地 字符串和整数之间的映射在枚举中定义

  • 我目前正在重构ASP。NET MVC项目中使用了洋葱结构,因为它似乎适合未来发展的需要。 我已经设置了我认为需要使用的层,现在我的解决方案如下所示: 所以,基本上正如我所理解的,ClientName。核心项目根本不应该引用其他项目。客户端名称。基础架构应引用客户端名称。核心 。ClientName上的Interfaces文件夹。核心定义客户端名称中的服务。基础架构、my DbContext和域实体

  • 我不熟悉Mapstruct,在特定用例中遇到问题 因此,如果我的来源属性hotmail.com我的目标属性应该收到“个人”,如果我的来源facebook.com我的目标应该收到“公司”。 我想用表达法,但没法绕过它。我该怎么做?

  • 我目前正在开发一个restful API。NET Web API,并有一个域模型(使用实体框架)和一个DTO模型发送给客户端。 显然,API中的域模型和DTO模型之间存在一些映射。 API中我的一个控制器是Employee控制器,您可以对其执行所有CRUD操作。我创建了一个EmployeeDto对象用于控制器-例如,它可能如下所示: 我的控制器可能有以下动作方法: 我的难题是,是否适合为控制器中的

  • 问题内容: 我是Go语言的新手,具有C#背景并且对如何构造Go应用程序感到困惑。 假设我正在构建一个REST API,它将位于数据库之上。还要说,即使完成后,鉴于业务的变迁等,此应用程序可能仍需要频繁更改。 在带有诸如Entity Framework和DTO之类的工具的C#中,我通过从控制器给出的结果中抽象出数据库来缓解此问题。如果更改数据库中一堆字段的名称,则可能必须更改数据库访问逻辑,但是希望