Un'applicazione C # .NET parla con un componente esterno chiamando una API nota e le strutture di interoperabilità di marshalling dalla risposta del componente.
Questo è già implementato e funziona bene. Tuttavia, una volta che le versioni entrano nell'equazione, le cose diventano un po 'più complicate: il componente si evolverà nel tempo e quindi le strutture di interope saranno mantenute in-sync. L'applicazione deve essere ancora in grado di parlare con i componenti delle versioni precedenti, in modo che debba selezionare le strutture di interoperabilità corrette in fase di esecuzione per una determinata versione del componente.
Ho gettato questo problema nella mia testa per un paio di giorni e non ho trovato nulla di cui sono particolarmente felice. Anche Google non è stato di grande aiuto, quindi ho pensato di provare a scrivere questo post e a postarlo qui per ottenere un feedback. Questo è quello che ho finora.
Raggruppa tutte le versioni delle strutture in una libreria, ha un registro e decide in fase di esecuzione quali strutture utilizzare
Qui, ogni nuova versione delle strutture viene compilata nella nuova versione dell'applicazione .NET e alcuni tipi di registro sono responsabili della mappatura delle versioni dell'API per l'interoperabilità delle versioni delle strutture nella libreria.
Il naming di classe / struct diventa un problema, dal momento che Class1
ora deve essere chiamato Class1_v1_1
o qualche altro modo per disambiguare in base al nome (o quello o usare lo stesso nome e metterli in uno spazio dei nomi separato ).
Carica le versioni delle strutture di interoperabilità da una DLL con versione
Qui, ogni versione delle strutture di interoperabilità viene compilata in una singola DLL e caricata dinamicamente in base alla versione dell'API. Una mappatura dovrebbe ancora essere creata tra la versione dell'API e il nome della DLL.
Il problema di denominazione scompare, ma certamente ci sono molti più elementi mobili per la distribuzione e di conseguenza cose che possono andare storte in fase di runtime.
Come ho detto, non sono contento di nessuno dei due e sento che c'è una soluzione molto evidente / più pulita / elegante che mi sfugge. Non riesco a immaginare di essere la prima persona che ha dovuto supportare le versioni mutevoli di un componente dipendente, quindi c'è qualche schema noto che può fornire indicazioni per scenari come questo?
Grazie in anticipo per eventuali feedback e / o possibili alternative!