代码之家  ›  专栏  ›  技术社区  ›  Lance

何时在Angular+Java项目中使用DTO和Matpstruct

  •  2
  • Lance  · 技术社区  · 6 年前

    好的,我有一个大项目,我想把它做好。。我甚至不知道标准是什么。

    问题: 我有几个实体,它们之间的关系需要一起显示在页面上。在视图中显示前3个事件。其中 事件 与…有关系 EventInstance事件实例 A. 取消策略 ,和到多个 定价 (截止日期)和多个 事件注释 (按您的注册状态筛选)

    可能的解决方案: (假设我使用服务/可观察对象来获取数据,并且我拥有所有java和angular模型等)

    (A) 在angular fetch中,获取事件的实例、相关的Pricing集、注释以及每个实体自己的服务的CancelationPolicy。

    (B) 创建Java服务,该服务返回一个自定义视图DTO,并将所有数据编组在一起。

    C) 使用Mapstruct为每个实体创建DTO/Mapping/etc,我可以调用事件服务。。。

    。。。。。但是,如果我这样做,我不需要为所有这些实体进行DTO/映射吗。。。我不需要对每个与这些对象有关系的实体都这样做吗。。。然后这些实体服务需要 只有 返回DTO。。现在这一切听起来太复杂了,尤其是因为我有30个实体。。我只是把自己从Mapstruct/DTO世界吓跑了。

    我错过了什么?

    我使用jhipster(angular 5、Spring Boot、mapstruct等)让一切变得简单。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Lorelorelore R. Foxwood    6 年前

    让我们来点秩序。。。

    实际上,您不必返回DTO,只需返回实体即可。然而,我不鼓励这种习惯,因为您应该始终向外部世界隐藏您的数据库结构。因此,使用DTO总是一个不错的选择,因为您可以选择只映射实体中包含的信息的子集。

    现在让我们转到MapStruct。通过defaut,MapStruct将实体中的所有内容映射到DTO,反之亦然,而无需指定每个映射。在项目开始时,您可以选择使用类似的实体和DTO,然后让MapStruct为您完成这项工作,您只需说出映射的源和目标,MapStruct将通过反射构建映射器。然后,在进行一些性能测试之后,您可以选择只对最耗时的映射进行一些调优。

    我知道返回实体可以加快交付速度,但您可以使用DTO更好地管理将影响实体的任何更改。或者,可以使用Spring Rest存储库将实体返回到前端组件。