Penso che i vantaggi di questo approccio siano di gran lunga superiori a qualsiasi svantaggio.
Quello che stai ottenendo qui è più o meno una perfetta "implementazione" del I
in SOLID
con il pattern Stairway
- vale a dire, l'applicazione dipende "in basso" su un'interfaccia definito in Company.Framework.Persistence.dll
e anche le singole implementazioni dipendono "su" da questa astrazione.
Questo significa che la tua applicazione è molto disaccoppiata da qualsiasi dettaglio di implementazione (ovviamente vorresti comporre il grafico di runtime attuale usando un container IOC di qualche tipo)
Ho spudoratamente collegato a un'immagine esistente di questo modello da un'altra risposta sull'argomento su Stack Overflow:
Nellibro Adaptive Code tramite C # l'autore parla di questo approccio e lo chiama specificatamente come qualcosa che dovrebbe sempre essere fatto perché fornisce un livello così alto di disaccoppiamento. ( esempio )
Un altro possibile vantaggio è la possibilità di applicare patch alle implementazioni individuali senza preoccuparsi di averne influenzato altre, anche se questo è abbastanza limitato una volta che sei stato diligente con i tuoi test di regressione; anche la possibilità di implementare le singole implementazioni in sottocartelle che possono contenere anche le versioni specifiche di eventuali dipendenze di terze parti di cui potrebbero aver bisogno probabilmente aiuterà a mantenere le cose ben organizzate.
L'unico vero svantaggio che posso pensare con questo approccio è che è possibile in teoria cambiare l'interfaccia in Company.Framework.Persistence.dll
(insieme ai binari dell'applicazione) e trascurare di aggiornare le corrispondenti DLL di implementazione che porteranno a errori di runtime per i tuoi utenti.
Essendo stato colpevole di aver fatto esattamente questo in passato, posso dire che questo è davvero qualcosa che può accadere se sei molto distratto:)