带有 Spring 的 ModelMapper,在哪里放置显式映射?

ModelMapper with Spring, where to put explicit mappings?

我将 ModelMapper 与 Spring 一起使用。在我的控制器中 class 我正在自动装配 ModelMapper bean:

@Autowired
private ModelMapper mapper;

我想在我的模型 class 和我的控制器方法中的 DTO 之间进行显式映射,例如:

modelMapper.addMappings(mapper -> {
  mapper.map(src -> src.getBillingAddress().getStreet(),
      Destination::setBillingStreet);
  mapper.map(src -> src.getBillingAddress().getCity(),
      Destination::setBillingCity);
});

然后使用映射器映射classes。

我的问题是,在每个控制器方法调用中添加显式映射是否正确?对象 modelMapper 的内存大小会开始增长吗?

其他解决方案是在创建 ModelMapper bean 时仅添加一次映射,但我认为将映射逻辑放在 bean 配置中不是一个好的决定。

ModelMapper的bean配置中设置映射逻辑完全没问题。 映射是那个class的实际任务,所以应该在创建的时候配置。

不过,我更喜欢创建多个专用映射器定义,每个类型或一组相关类型一个。

这样做可以将配置方面与控制器中映射器的实际使用分开,而不会在一个 class 中创建一大堆不相关的映射配置代码。 实际上,在每个控制器中配置映射器会违反 DRY(不要重复自己)和 SoC(关注点分离)等原则。

在您的情况下(单例 ModelMapper),您可以为要映射的每个类型或类型组创建 @Configuration-注释 classes。 在该 class 中,您将收到 ModelMapper 并添加类型映射。 将您的配置代码添加到

  • 一个ModelMapper-接收构造函数或
  • 一个 @PostConstruct 注释方法,它访问 @Autowired ModelMapper 属性。

我自己还没有用过 ModelMapper 但是在查看它的代码库之后我猜想如果你按照你原来的方法,内存使用量不会增加但是你会发现重复映射被抛出的异常.