Conversione di dati in Setter in un DTO

1

Ho scritto un semplice DTO per trasferire dati da un punto a un altro, o lo era il pensiero iniziale.

Ora mi sono appena preso l'abitudine di fare varie cose nel DTO, per semplicità, come convertire i dati in un setter DTO per assicurarsi che si adatti al formato, o anche per convalidarlo e lanciare un'eccezione, per ridurre il metodo Chiama / semplifica il punto in cui stai effettivamente idratando il DTO con le informazioni.

Poiché le DTO, secondo la definizione che conosco, non dovrebbero avere alcun comportamento tranne la memorizzazione e il recupero dei dati, ora sto cercando una struttura migliore.

I DTO qui usati sono principalmente per il trasferimento di dati da una classe sorgente (controller) in altre classi (ad esempio gateway di pagamento) per avere la stessa denominazione di dati (ad esempio "prezzo" per il prezzo della transazione) per tutti i gateway, che quindi vengono elaborati di conseguenza nel livello anticorruzione davanti all'SDK del gateway di pagamento fornito dai rispettivi fornitori.

User code --> DTO -> Gateway ACL (-> SDK -> …)

Poiché la mia attuale configurazione non si allinea con una definizione di DTO, sto cercando un'architettura pulita e corrispondente a un modello di progettazione.

Un esempio del mio DTO ora non conforme a DTO:

class GenericDataTransferObject {
    protected $price;

    public function setPrice($price) {
        $this->price = $this->convertAmount($price);
    }
}

abstract class AbstractDataTransferObject {
    protected convertAmount($amount) {
        // …
    }
}

Come apparirebbe in un mondo perfetto?

    
posta pduersteler 12.11.2015 - 11:05
fonte

1 risposta

2

Puoi aggiungere un nuovo livello (che di solito chiamo adattatori o colla ) per gestire queste conversioni tra oggetti utente e DTO.

User code --> adapters/glue --> DTO

Il codice dell'adattatore sarebbe simile a:

class MyAdapter {

    public toDTO(BusinessObject $bo) {
        DTO $dto = new DTO();
        $dto.setPrice(convertAmount($bo.getPrice());
        return $dto;
    }

    private convertAmount($amount) {
        //Convert according to some rule
    }

    public fromDTO(DTO $dto) {
        //If the reverse operation is needed
    }
}
    
risposta data 12.11.2015 - 11:33
fonte

Leggi altre domande sui tag