La mia attività corrente richiede l'utilizzo di una serie di chiamate al servizio Web a un fornitore di terze parti per recuperare e aggiornare le informazioni.
Gli oggetti utilizzati in queste chiamate, ovvero la risposta da un get e l'oggetto passato a (e ricevuto da) un aggiornamento - sono identici ad eccezione del prefisso attaccato agli oggetti.
Ad esempio, una chiamata al metodo get può restituire un oggetto come questo ( la struttura effettiva può essere profonda una dozzina di livelli e avere un mix di proprietà / collezioni ):
<getFooResponse>
<getFooResponsePropertyA>1</getFooResponsePropertyA>
<getFooResponsePropertyB>2</getFooResponsePropertyB>
<getFooResponsePropertyC>3</getFooResponsePropertyC>
</getFooResponse>
e una chiamata al metodo update può richiedere un oggetto simile:
<updateFooRequest>
<updateFooRequestPropertyA>4</updateFooRequestPropertyA>
<updateFooRequestPropertyB>5</updateFooRequestPropertyB>
<updateFooRequestPropertyC>6</updateFooRequestPropertyC>
</updateFooRequest>
e restituisce un terzo oggetto simile:
<updateFooResponse>
<updateFooResponsePropertyA>4</updateFooResponsePropertyA>
<updateFooResponsePropertyB>5</updateFooResponsePropertyB>
<updateFooResponsePropertyC>6</updateFooResponsePropertyC>
</updateFooResponse>
Usando C #, i riferimenti di servizio sono facilmente aggiunti al mio progetto e le concrezioni delle classi necessarie per chiamare l'API o analizzare una risposta vengono generate per me.
Il mio problema sta nel fatto che 3 classi vengono generate automaticamente con una struttura quasi identica.
Così ho (generato automaticamente):
- ottieni Foo Risposta
- aggiornamento Foo richiesta
- aggiornamento Foo risposta
l'unica differenza è il prefisso / suffisso.
Mi interessa davvero solo l'oggetto Foo (poiché è identico a tutti i 3 scenari).
È uno scenario abbastanza comune fare quanto segue
- ottieni una risposta dal sistema di terze parti
- modifica leggermente la risposta
- invia la risposta modificata al sistema di terze parti (dopo averlo convertito da un getFooResponse a un updateFooRequest )
Il problema sta nella quantità di codice necessaria per mappare da una versione all'altra dell'oggetto. Mi rendo conto che posso farlo con la riflessione, ma non è chiaro come vorrei e non sono sicuro di quanto sia mantenibile per chi viene dopo di me.
Ho altre opzioni oltre a scrivere codice che mappatura dei codici rigidi tra diversi sapori degli oggetti?