Prima di entrare nel merito della tua domanda, ti faccio notare che la struttura che hai fornito ha alcuni problemi (che hai notato, ma lascia che me ne esamini un po '):
Questoprogettoutilizzainversionedidipendenzadirendereilcliente(Application)eunservizioconcreto(ungatewayDB-SQL,Test)indipendentil'unodall'altro,rendendoognidipendonosull'interfacciaIDatabase.Tuttavia,ilfattochel'applicazionecreiilservizioconcretolorendedipendentedaltipoconcreto,cheinunacertamisuracompromettel'interaconfigurazione.Lamisuraincuiquestoèinrealtàunproblemadipendepensacome:ciòcheilcodicedelclientfa,ladisciplinadeglisviluppatori(interminidiisolarel'accoppiamentoaunpezzobendefinitodellaclasseApplication),letecnicheutilizzate(adesempio,ilquadrocambiaunpo'seilservizioconcretovieneistanziatoattraversolariflessione),comesidesideraorganizzareilcodiceinlibrerie,ecc.
BasandosisolosulletecnicheOOtradizionali,ilmodoperassicurarsicheilcodiceclientenonèaconoscenzadeitipiconcreticheimplementanoIDatabaseèquellodiintrodurreunterzopezzodicodicecheconoscetuttiquestitipi,edèquindiingradodiagganciarli(equesto,asuavolta,consenteaquestitipidirimaneredisaccoppiati).Negliapproccicheutilizzanol'iniezionedidipendenza,questaterzapartedicodicesaràingenerelaradicedicomposizione(piùomeno,ilpuntodiingressodell'applicazione).
UnmodopercambiareildiagrammadiclasseoriginalechehaipostatoinmodocheseguaquestastrutturaèdividerelaclasseApplicationindueparti.Unapartesaràlaradicedellacomposizione(iltingchecreaesicollegaegiral'altraparteoabilitaaltrimentil'esecuzione).L'altrapartesaràilcodiceclientcheutilizzaIDatabase.
Ciòconsenteditestarequest'altraparte(lalogicaaziendaleeffettivacontenutanelcodiceclient)inisolamento(adesempio,testdell'unità)fornendoun'istanzadidatabaseconcretanelcodiceditesttramitel'iniezionedelcostruttore.
Ilmodochehodescrittofinora,quandositrattadicrearecasiconcreti,laradicecomposizioneutilizzaessenzialmente"codice come configurazione", ma se si vuole (o la necessità di), si può rendere veramente configurabile da averlo leggi un file di configurazione e prendi le sue decisioni basandosi su quei dati, oppure puoi contare su un contenitore DI per gestire la configurazione, l'iniezione delle dipendenze e il ciclo di vita dell'oggetto per te.