Spring实体应该在服务中转换为Dto吗?

2024-05-06

对此发表评论后question https://stackoverflow.com/questions/34058238/spring-service-and-repository-layer-convention/34066805?noredirect=1#comment55918905_34066805。我开始研究,但我仍然很困惑。
实体在返回控制器之前应该转换为 Dto 吗?对我来说,这听起来不太实用。


我们正在谈论软件架构,并且一如既往,当我们谈论软件架构时,有一千种做某事的方法,并且关于什么是最好的方法有很多意见。但没有最好的办法,凡事都有优点和缺点。请记住这一点!

通常你有不同的层:

  • 存储数据的持久层
  • 业务层对数据进行操作
  • 用于公开数据的表示层

通常,每一层都会使用自己类型的对象:

  • 持久层:存储库、实体
  • 业务层:服务、领域对象
  • 表示层:控制器、DTO

这意味着每一层只能处理自己的对象,并且永远不会将它们传递到另一层。

Why?因为您希望每一层都与其他层分开。如果您要在控制器中使用实体,您的演示文稿将取决于数据的存储方式。那真的很糟糕。您的视图与数据的存储方式无关。它甚至不应该知道这一点或数据是如何存储的。

想一想:您更改了数据库模型,例如您向其中一个数据库表添加一个新列。如果将实体传递给控制器​​(或者更糟:控制器将它们公开为 JSON),数据库中的更改将导致演示文稿中的更改。如果实体直接公开为 JSON,这甚至可能会导致 JavaScript 或使用 JSON 的其他一些客户端发生更改。因此,数据库中的简单更改可能需要 JavaScript 前端的更改,因为层之间的耦合非常紧密。您绝对不希望在实际项目中出现这种情况。

How?您怀疑这是否实用,因此仅举一个小示例来说明如何在(伪)代码中执行此操作:

class Repository {
    public Person loadById(Long id) {
        PersonEntity entity = loadEntityById(id);
        Person person = new Person();
        person.setId(entity.getId());
        person.setName(entity.getFirstName + " " + entity.getLastName());
        return person;
    }
}

在此示例中,您的存储库将在内部使用实体。没有其他层知道或使用这个实体!它们是该特定层的实现细节。因此,如果存储库被要求返回一个“人”,它会作用于实体,但它将返回一个域对象。因此,在需要更改实体的情况下,可以保存与存储库一起使用的域层。正如您所看到的,名称、域和数据库可能不同。虽然数据库以名字和姓氏存储名称,但域只知道一个名称。这是如何存储名称的持久性的细节。

控制器和 DTO 也是如此,只是另一层。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring实体应该在服务中转换为Dto吗? 的相关文章

随机推荐