【发布时间】:2013-07-06 02:15:40
【问题描述】:
Java 或 dotNet 世界有丰富的开源框架和库。我们几乎在任何地方都喜欢使用 Spring 和 Hibernate。 每个人都同意hibernate是一个非常方便的工具。 Hibernate 可以做什么?好吧,基本上 - Hibernate 可以跟踪我们的域对象更改并仅将修改后的数据保存到数据库中,就是这样。 基本上,这就是我们想要的一切。我想从数据库中加载一些记录,对它们进行一些修改,然后调用 transaction.commit(),所有修改都会立即持久化。 太好了,对吧!
但是网络世界呢?在 Web 应用程序中,数据库会话必须关闭。 我无法加载一些域对象并等待用户通过 HTTP 进行修改,并在修改后保留这些对象。
我们必须使用分离的对象或 DTO。这个怎么运作 ? 用户在 HTML 浏览器中进行修改,spring Mvc 使用 MVC 模型绑定自动将这些 HTML 修改传递给我们自定义的 DTO 对象, 然后我们做一些编程工作来将修改从 DTO 对象转移到休眠域对象,然后我们才持久化它们。 例如 - 我们有一个更新客户地址的 Web 表单,以及另一个更新客户详细信息的表单。 我们必须有两个不同的业务层方法——UpdateAddress() 和 UpdateDetails(),这两个方法都必须接受某种 DTO, 一个代表地址信息,另一个代表详细信息。 我们还有自定义逻辑,将数据从这 2 个 DTO 传输到域类“客户”。 是的,当然,我们可以重用我们的域类,而不是 DTO 对象。但这并没有让它变得更简单。 在这两种情况下,我们仍然必须实现将修改传输到持久对象的自定义逻辑, 我不能立即持久化分离的对象,因为通常域类有很多很多属性,代表着许多关系,例如。客户有 - Orders 属性。当我更新客户地址时,我不想更新其订单。
是否有一种美观通用的方法可以将修改从 mvc 模型映射到域对象,而无需编写大量自定义代码并且没有覆盖太多字段的风险?
【问题讨论】:
-
使用 AutoMapper 意味着我必须为每个 Service 方法创建自定义地图,这实际上与使用自定义代码进行传输相同。
-
这是一行代码而不是手动映射所有项目属性。如果存在无法推断的实体,则为该实体明确定义映射,但大多数情况下可以节省大量时间。
-
它永远不是一行代码...我为每个服务方法创建多个自定义 DTO 类并使用 1 行代码映射映射它们。或者我使用域对象并为每个服务方法创建映射,指定要包含的属性和要排除的属性,以及嵌套对象的行为。我只是告诉你,如果映射行为可以根据传入的 JSON 或 HTTP POST 参数确定,那么这些映射不是必需的。请看这里-sites.google.com/site/upida4j
标签: asp.net-mvc hibernate model-view-controller spring-mvc orm