Вам не следует связывать два POJO
класса из разных доменов в constructor
. Эти два класса не должны ничего знать друг о друге. Может быть, они представляют одну и ту же концепцию в двух разных системах, но они не одинаковы.
Хороший подход заключается в создании интерфейса Abstract Factory
, который будет использоваться везде, где Car
должно быть создано из ThirdPartyCar
:
interface ThirdPartyCarFactory {
Car createNewBasedOn(ThirdPartyCar source);
}
и одна реализация может быть вашей RepositoryThirdPartyCarFactory
:
class RepositoryThirdPartyCarFactory implements ThirdPartyCarFactory {
private CarStatusMappingRepository repo;
private CarMapper carMapper;
public Car createNewBasedOn(ThirdPartyCar thirdPartyCar) {
Car car = new Car();
carMapper.map(thirdPartyCar, car);
CarStatus status = repo.findByThirdPartyCarStatus(thirdPartyCar.getStatus());
car.setStatus(status);
// set other props (including nested props) that depend on repos
return car;
}
}
В приведенной выше реализации вы можете найти CarMapper
, который знает, как сопоставить ThirdPartyCar
с Car
. Для реализации этого картографа вы можете использовать Dozer , Orika , MapStruct или вашу собственную реализацию.
Другой вопрос, как вы получили ThirdPartyCar
объект. Если вы загрузите его на ID
из ThirdPartyRepository
, вы можете изменить свою абстрактную фабрику на:
interface CarFactory {
Car createNew(String id);
}
и данная реализация загружается на ID
ThirdPartyCar
и отображает его на Car
. Все скрыто фабрикой, которую вы легко можете обменять.
Смотри также: