Sto cercando modelli o best practice per mantenere versioni diverse di un contratto API . Esistono molte informazioni su Internet relative alle API della versione (URL e intestazioni, ecc.), Ma questa domanda è correlata al mapping da un modello di oggetto a diverse versioni dei tipi di contratto (DTO), e per questo non sono stato in grado di trovare alcuna informazione.
Immagina di avere un progetto web con un endpoint e un'app client (potrebbe essere desktop o mobile) che comunica con il progetto web utilizzando quell'endpoint. L'endpoint viene utilizzato solo dall'app client, ovvero è un endpoint interno, non pubblico. La comunicazione tra il progetto web e l'app client funziona dall'app client inviando alcuni dati all'endpoint e il progetto Web lo riceve, lo elabora e restituisce un oggetto risposta. C'è un contratto per come dovrebbe apparire la struttura dei dati inviati all'endpoint e inviati dall'endpoint. È abbastanza complesso in termini di tipi del numero di tipi di oggetti e del loro nidificazione. Non puoi controllare quando i tuoi utenti aggiornano la loro app client, ed è un requisito aziendale retrocompatibile.
Hai un modello di oggetti che si evolve e non c'è problema dato che hai separato il contratto API (DTO) e il modello a oggetti. Hai un codice di mappatura che mappa dal modello a oggetti al contratto e viceversa.
Puoi apportare modifiche senza interruzioni al contratto, ma se hai bisogno di apportare modifiche urgenti, avrai bisogno di una nuova versione del contratto e dovrai assicurarti di poter eseguire la mappatura dal modello a oggetti il nuovo contratto. Ma dato che devi essere retrocompatibile, devi anche assicurarti di poter mappare in qualche modo dal modello a oggetti alla versione precedente del contratto.
La mia domanda è quindi: come gestiresti architettonicamente questo? Conosci modelli o best practice che possono essere utilizzati per questo?
La sfida è quando si modifica il modello di oggetto e si crea un nuovo contratto, inoltre è necessario assicurarsi che ci sia un modo in cui il vecchio contratto continua a funzionare. Un modo vedo che è possibile farlo mantenendo un mapping dal modello a oggetti a ciascuna versione del contratto.
Un altro modo potrebbe essere solo mantenere un mapping dal modello di oggetto al contratto più recente, ma poi mantenere un percorso di migrazione dalle diverse versioni del contratto (quindi quando è necessario mappare da v3 a v1, dovresti mappare da modello a oggetto a contratto più recente (v3), quindi mappare a v2, quindi mappare a v1).
Un altro problema da considerare è la quantità di duplicazione . Quando il contratto ha un sacco di tipi e devi solo eliminare un singolo campo da uno dei tipi, questa è una modifica di rottura e richiede una nuova versione. Copierai l'intero contratto (Tutti i tipi) in una nuova cartella nel tuo progetto, quindi cancellerai il campo? Ciò significherebbe che hai un contratto quasi identico e molti tipi verrebbero duplicati. La duplicazione in questo caso può essere giustificata, ma esiste un modo migliore?
Qualsiasi suggerimento, approfondimento e suggerimento sono apprezzati.