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

3

好的,我有一个大项目,我希望做得正确,但我甚至不知道标准是什么。

问题:我有几个实体与关系需要一起在页面上显示。在视图中显示前3个事件。其中事件事件实例取消策略以及多个价格(截止日期)和多个事件注释(根据您的注册状态进行过滤)有关系。

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

A) 在angular中获取事件,然后获取事件的实例,相关的定价集,注释以及每个实体自己的取消策略服务。

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

C) 使用Mapstruct为每个实体创建DTO / Mapping / etc,并调用Event Service ...

......但是,如果我这样做,难道我不需要为所有这些实体做DTOs / Mapping吗?难道我不需要为每个具有与这些对象的关系的实体都做这个?现在这些实体服务需要仅返回DTOs..现在这听起来太复杂了,特别是我有30个实体..现在我已经吓到自己不想用Mapstruct / DTO世界了。

我错过了什么?

我使用jhipster(angular 5,Spring Boot,mapstruct等)使其变得半易于操作。

1个回答

3

让我们来整理一下...

实际上,你不必返回DTOs,你可以直接返回entities。然而,我不鼓励这种做法,因为你应该始终将你的数据库结构隐藏起来,不暴露给外界。因此,使用DTOs总是一个好选择,因为你可以选择只映射实体中包含的部分信息。

现在让我们转到MapStruct。默认情况下,MapStruct会将你的entity中的所有东西映射到你的DTO中,反之亦然,无需指定每个单独的映射。在项目开始时,你可以选择有类似的entity和DTO,然后让MapStruct为你完成工作,你只需要说出映射的源和目标,MapStruct通过反射将构建Mappers。然后,在进行一些性能测试之后,你可以选择仅针对最耗时的映射进行一些调整。

我知道返回entities可能会导致更快的交付,但你可以使用DTOs来更好地管理任何影响你的entities的变化。或者,你可以使用Spring Rest Repositories将entities返回给你的前端组件。


1
关于MapStruct的一个澄清,MapStruct不会通过反射进行映射。它是一个注解处理器,会为您生成Java代码。因此,速度与手写映射相同。 - undefined
这就是为什么使用MapStruct比Dozer更好的原因。 - undefined
完全同意答案,我只是补充一下,如果你无法使用mapstruct编写映射,那么你的代码不会太依赖于mapstruct,只需手动实现接口并摆脱mapstruct即可。真的不需要太大的投入。 - undefined
有一个需要注意的是,MapStruct不需要任何运行时依赖。核心的公共API只包括注解和用于实例化映射器的工厂(如果使用Spring的componentModel,则不需要该工厂)。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接