Il controllo delle versioni è un argomento complesso, quindi per prima cosa è necessario definire i propri obiettivi in modo più descrittivo. Sarebbe bello dire che hai un'interfaccia che non romperai mai la compatibilità, ma a seconda di quale sia la nuova funzionalità, potrebbe non essere nemmeno possibile. Quindi ci sono diverse situazioni e diversi compromessi.
Se il tuo intento è solo fornire nuove funzionalità ai nuovi consumatori e tutti i tuoi consumatori sono consumatori diretti (senza intermediari, strutture, ecc.), Un approccio discreto all'endpoint è la scelta migliore. Ogni volta che si aggiunge una funzione che rischia una pausa, creare un nuovo endpoint, assegnargli un nuovo numero di versione e informare gli utenti di convalidarlo e cambiare le loro configurazioni. Questa strategia è abbastanza provata e vera, ma ha gli inconvenienti di mettere l'onere sui consumatori di tenersi aggiornati. Inoltre, se ci sono dipendenze tra i servizi può diventare un compito da tenere traccia. Il vantaggio è che se il codice si rompe non è (direttamente) colpa tua.
L'altra strategia principale è l'interfaccia estensibile. Ci sono tre diverse varietà qui di cui sono a conoscenza. Innanzitutto, è il tipo di interfaccia che tenta di descrivere in modo così chiaro il dominio del servizio che ogni possibile caratteristica che potresti aggiungere è in qualche modo possibile data l'interfaccia esistente. Se sembra difficile, lo è. Potresti chiamare questa l'interfaccia perfetta. Tutto è completamente descritto, ma anche l'intero dominio è completamente descritto. Il "perfetto" è in realtà solo sulla carta però.
La seconda varietà è il tipo che sembra un'interfaccia normale ma aggiunge punti di estensione generici. In WSDL questo significa xs: any, coppie nome-valore o qualcosa di simile. Si potrebbe chiamare questa interfaccia di base estendibile. Non è troppo difficile da fare, ma non è senza complicazioni. I punti di estensione possono rendere l'interfaccia più difficile da utilizzare in determinati strumenti (xs: any), o perdere esplicitamente parte della capacità di convalidare input e output (coppie nome-valore). È anche piuttosto facile abusare di quei punti di estensione in un modo che rende la versione 3 o 4 piuttosto difficile da usare.
La terza varietà è il tipo che converte l'interfaccia in un flusso di byte. Potresti chiamare queste interfacce di dio. Non sono esenti da giustificazioni, ma se ne stai usando uno, potresti chiederti perché stai utilizzando i servizi web. Forse dovresti pensare a TCP/IP non elaborato o GET/POST HTTP di base. Ma forse sei stufo della complessità di WSDL e XSD e vuoi solo ricominciare da capo ma sei legato ai servizi web per qualche motivo infrastrutturale. Tuttavia, una volta iniziato questo percorso, avrai bisogno di un modo completamente nuovo di descrivere ai tuoi consumatori come/non usare il tuo servizio, e se usi XSD per questo ... beh, in pratica sei tornato dove hai iniziato tu.
La soluzione migliore è conoscere tutte queste opzioni e avvicinarsi alla progettazione del servizio cercando innanzitutto la "perfetta interfaccia", rinunciando e aggiungendo punti di estensibilità generici. Cercare di progettare l'interfaccia perfetta ti costringerà a imparare cose che renderanno il tuo servizio migliore, non solo la tua interfaccia, ma ci vorrà del tempo, e se non limiti quel tempo in qualche modo, ci vorrà per sempre.
Un po 'meno di una vera interfaccia di Dio, c'è l'interfaccia del wrapper. Se il tuo sistema ha dei livelli, vuoi che anche la tua interfaccia sia a strati. Quando si modifica il livello B, si desidera solo modificare il livello B, non tutte le istanze nel livello C.
Questo potrebbe funzionare solo se i servizi web di versione prendono * esattamente * la stessi argomenti, quindi vale lo stesso WSDL. Se in una nuova versione richiede l'aggiunta di un nuovo attributo, cosa fai? –