Voglio porre alcune domande sulle migliori pratiche relative ai tipi di mappatura e all'utilizzo dei metodi di estensione in C #. So che questo argomento è stato discusso più volte negli ultimi anni, ma ho letto molti post e ho ancora dubbi.
Il problema che ho riscontrato era l'estensione della classe che possiedo con la funzionalità "converti". Diciamo che ho una classe "Person" che rappresenta un oggetto che verrà usato da qualche logica. Ho anche una classe "Cliente" che rappresenta una risposta da API esterna (in realtà ci sarà più di un'API, quindi ho bisogno di mappare la risposta di ciascuna API al tipo comune: Person). Ho accesso al codice sorgente di entrambe le classi e teoricamente posso implementare i miei metodi lì. Devo convertire il cliente in persona per poterlo salvare nel database. Il progetto non utilizza alcun mappatore automatico.
Ho in mente 4 possibili soluzioni:
Metodo .ToPerson () nella classe Consumer. È semplice, ma sembra spezzare il modello di responsabilità singola per me, soprattutto che la classe Consumer è mappata su altre classi (alcune richieste anche da un'altra API esterna), quindi dovrebbe contenere più metodi di mappatura.
Costruttore di mappatura nella classe Person prendendo Consumer come argomento. Anche facile e sembra anche rompere il modello di responsabilità singola. Avrei bisogno di più costruttori di mapping (poiché ci sarà classe da un'altra API, fornendo gli stessi dati di Consumer ma in un formato leggermente diverso)
Classe di convertitori con metodi di estensione. In questo modo posso scrivere il metodo .ToPerson () per la classe Consumer e quando viene introdotta un'altra API con la propria classe NewConsumer, posso semplicemente scrivere un altro metodo di estensione e conservare tutto nello stesso file. Ho sentito un'opinione secondo cui i metodi di estensione sono malvagi in generale e dovrebbero essere usati solo se assolutamente necessari, quindi questo è ciò che mi trattiene. Altrimenti mi piace questa soluzione
Classe Converter / Mapper. Creo una classe separata che gestirà le conversioni e implementerò metodi che prenderanno l'istanza della classe di origine come argomento e restituiranno l'istanza della classe di destinazione.
Per riassumere, il mio problema può essere ridotto al numero di domande (tutte nel contesto di quello che ho descritto sopra):
Mettere il metodo di conversione all'interno (POCO?) Dell'oggetto (come il metodo .ToPerson () nella classe Consumer) è considerato rompere il singolo modello di responsabilità?
L'uso di costruttori di conversione in classe (simile a DTO) è considerato rompere il modello di responsabilità singola? Soprattutto se tale classe può essere convertita da più tipi di sorgente, quindi sarebbero necessari più costruttori di conversione?
L'uso di metodi di estensione pur avendo accesso al codice sorgente della classe originale è considerato una cattiva pratica? Tale comportamento può essere usato come modello praticabile per separare la logica o è un anti-modello?
Person
classe è una DTO? contiene qualche comportamento?