5

假设我们有一个使用 Spring 3.2.4、Hibernate 3.6.10 等的包含 100 多个实体的大型 Web 项目。该项目中的大多数控制器将基于 REST,并将通过 JavaScript 调用。

虽然我认为在概念上直接将实体编组/取消编组到视图更容易,但事实证明,在使用 Jackson 时,这在实践中非常糟糕。虽然@JsonIgnore 可用于避免无限递归,但有时这种“一刀切”的注释对整个应用程序并不完全适用——有时我需要一把手术刀,而且很多时候可以查看一个对象很多方面。

此外,尽管在使用 Hibernate 时使用 Jackson 的 Hibernate 模块来解决问题,但javaassist在使用 Spring MVC 测试框架时我仍然会遇到一些延迟初始化问题。

以上所有这些问题都可以通过简单地使用ViewModelsor来避免DTOs,所以这就是我倾向于的方向。不幸的是,创建和维护 100 多个 DTO 以及相互映射的代码是一项相当大的投资。

我还猜测我将不得不JsonDeserializer为每个 DTO 编写自定义类,这也是相当多的编码和测试。

最后,我不确定这是否明智,但我怀疑我的验证规则将从我的实体转移到我的视图模型上。我可能永远不需要对我的实际实体进行验证,但这种方法让我感到紧张。

有人可以强调一些在此类项目中实施和映射 DTO 的最佳实践,并就处理反序列化的最佳方法提供一些见解吗?我正在寻找能够导致易于维护的代码的实践,并且希望不是大量的手动、耗时的劳动。Martin Fowler 的汇编方法对我来说有点多。谢谢!

4

1 回答 1

3

通常,至少在更大的应用程序中是我的经验,我们在屏幕上显示的东西(模型方面)与实际的业务组件不同。您基本上想要的是一个不同的阅读和写作领域(CQRS可能是一种方式)。

使用单一模型无法创建用于搜索、报告和处理交易的最佳解决方案 (Greg Young)

过去对我有用的是,为那些差异很大的屏幕/模型创建一个数据库视图,并在这些视图上简单地实现另一个休眠实体(只读)。确保您可以将要调用的实际业务逻辑关联回原始业务实体。

如果这也有点过分,您可能想看看Dozer,它可以帮助您从/到对象映射。这样您就可以在 Java 中维护转换逻辑,而不必自己编写所有映射逻辑(您仍然需要对其进行配置,但这可能不那么痛苦)。

链接

  1. CQRS
  2. CQRS 文件pdf
  3. 推土机
于 2013-09-30T07:31:52.970 回答