Где должны находиться методы конвертации DTO -> Entity и наоборот?
Я расположил методы в сервисах. Удобно, но возникла проблема при тестировании. Метод конвертации в ДТО вызывается почти в каждом методе сервиса. И теперь при тестировании я должен каждый раз проверять, совпадает ли результат с нужным, вместо того, чтобы просто verify вызывался ли метод и все ( verify нельзя вызвать не на моке ).
Возникла идея перенести метод в отдельный класс, но я слаб в хороших практиках.
Подскажите, пожалуйста, куда было бы правильно перенести эти методы конвертации?
Мне создать отдельный пакет mapper, а в нем классы? Допустим, класс EmployeeMapper и в нем два метода toEmployee, toEmployeeDTO? Правильно ли я мыслю?
Это библиотека; а где ее вызывать, это уже другой вопрос.
Для каких-то простых преобразований, где достаточно вызвать библиотечные методы и все - тут да, городить отдельный layer смысла нет.
Но, по опыту, такое прокатывает редко - обычно приходится писать какие-то кастомные правила DTO <-> Entity <-> DTO, а это уже как раз стоит прятать в отдельные компоненты и оформлять дополнительным слоем рядом с контроллерами.
Параметризованный интерфейс не помешает. По крайней мере, все будет выглядеть "пусть безобразно, зато однообразно" :-)
Что-то типа
public interface MyMapper<D, E> {
D toDto(E entity);
E toEntity(D dto);
}
тогда конкретную имплементацию можно оформить как
public class MyBookMapper implements MyMapper<BookDto, Book> {
@Override
public BookDto toDto(Book entity) {
...
}
@Override
public Book toEntity(BookDto dto) {
...
}
}
public <D, T> D map(final T entity, Class<D> outClass) {
return modelMapper.map(entity, outClass);
}
public <S, D> D map(final S source, D destination) {
modelMapper.map(source, destination);
return destination;
}