Situazione
Ricevo messaggi da una terza parte e questi messaggi vengono utilizzati per creare o aggiornare le informazioni del database.
I messaggi e i dati da aggiornare possono essere de-serializzati in forma di oggetto, ma non sono esattamente identici, quindi ho bisogno di usare un oggetto per mappare le proprietà dell'oggetto messaggio in arrivo all'entità risultante.
Il trucco è che alcune di queste proprietà devono portare all'oggetto recuperato dal database.
Ho un set di DAO per gestire tutte le operazioni del mio database
Esempio (in codice Java)
public class CarMessage {
public String carType;
public String carOwnerType;
public String carOwnerId;
}
pubic class CarEntity {
public String carType;
public Person carOwner;
}
Domanda
Il codice che esegue la mappatura può eseguire la query nel database? O il recupero delle informazioni del database dovrebbe essere fatto al di fuori del codice di mappatura?
In altre parole, dovrei fare questo:
public class CarMapper {
private PersonDao personDao;
public CarEntity mapMessageToEntity(CarMessage message) {
CarEntity entity = new CarEntity();
entity.carType = message.carType;
entity.carOwner = personDao.retrievePersonFromDatabaseByTypeAndId(message.carOwnerId, message.carOwnerId);
return entity;
}
}
public class MessageHandler {
private CarMapper carMapper;
private CarDao carDao;
public void onMessage(CarMessage message) {
CarEntity carEntity = carMapper.mapMessageToEntity(message);
carDao.save(carEntity);
}
}
o questo:
public class CarMapper {
public CarEntity mapMessageToEntity(CarMessage message) {
CarEntity entity = new CarEntity();
entity.carType = message.carType;
return entity;
}
}
public class MessageHandler {
private CarMapper carMapper;
private CarDao carDao;
private PersonDao personDao;
public void onMessage(CarMessage message) {
CarEntity carEntity = carMapper.mapMessageToEntity(message);
carEntity.carOwner = personDao.retrievePersonFromDatabase(message.carOwnerId, message.carOwnerId);
carDao.save(carEntity);
}
}
Personalmente, sono più propenso alla seconda soluzione (tutto il DAO nel gestore), in quanto rende l'errore più gestibile ma ho qualche dubbio e mi piacerebbe sentire i pro ei contro della comunità.