È buona prassi accedere al database nella mappatura tra oggetto

3

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à.

    
posta Teocali 08.03.2016 - 15:06
fonte

1 risposta

3

Anche io andrei con la seconda soluzione, perché dà CarMapper e MessageHandler limiti di responsabilità più chiari. Nella prima soluzione CarMapper mappa le auto nella rappresentazione interna e è responsabile di recuperare alcune informazioni dal DB. Se vuoi testare CarMapper in isolamento devi sempre passare attraverso la seccatura di deridere l'accesso al tuo DB. Dove nella seconda soluzione si limitano a inviare messaggi all'istanza di test e si asserisce sul CarEntity s creato.

Forse una proposta per la soluzione 2.b:

Per mantenere MessageHandler focalizzato sul flusso generale del processo (passaggio uno: mappatura, passaggio 2: aggiungi informazioni DB e passaggio 3: salvataggio) potresti introdurre una terza classe (qualcosa come CarEntityEnricher ) che contiene la logica di recupero delle informazioni dal DB e inserimento dell'istanza CarEntity .

    
risposta data 08.03.2016 - 20:56
fonte

Leggi altre domande sui tag