Я использую ModelMapper с Spring. В моем классе контроллера я автоматически подключаю bean-компонент ModelMapper:

@Autowired
private ModelMapper mapper;

Я хочу сделать явное сопоставление между моим классом модели и моим DTO в моих методах контроллера, например:

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

А затем используйте картограф для сопоставления классов.

Мой вопрос: правильно ли добавлять явные сопоставления при каждом вызове метода контроллера? Будет ли объект modelMapper увеличиваться в объеме памяти?

Другое решение - добавить сопоставление только один раз при создании bean-компонента ModelMapper, но я не думаю, что включение логики сопоставления в конфигурацию bean-компонента - хорошее решение.

7
italktothewind 23 Сен 2018 в 04:30

1 ответ

Лучший ответ

Совершенно нормально настроить логику сопоставления в конфигурации bean-компонента ModelMapper. Сопоставление - это фактическая задача этого класса, поэтому его следует настроить при создании.

Тем не менее, я предпочитаю создавать несколько специализированных определений картографов, по одному для каждого типа или группы связанных типов.

Это позволяет отделить аспект конфигурации от фактического использования сопоставителя в контроллерах - без создания большой кучи несвязанного кода конфигурации сопоставления в одном классе. Действительно, настройка сопоставителя в каждом контроллере нарушит такие принципы, как DRY (не повторяйтесь) и SoC (разделение задач).

В вашем случае (синглтон ModelMapper) вы можете создавать @Configuration - аннотированные классы для каждого типа или группы типов, которые вы хотите сопоставить. Внутри этого класса вы получите ModelMapper и добавите сопоставления типов. Добавьте свой код конфигурации в

  • ModelMapper - принимающий конструктор или
  • @PostConstruct - аннотированный метод, который обращается к атрибуту @Autowired ModelMapper.

Я сам еще не использовал ModelMapper, но, заглянув в его кодовую базу, я предположил, что если вы последуете своему исходному подходу, использование памяти не увеличится, но вы обнаружите исключения, связанные с дублированием сопоставлений.

4
Hero Wanders 23 Сен 2018 в 02:23