In che modo l'inversione del controllo è correlata all'inversione di dipendenza

11

In molti articoli su tutto il web i termini Inversion of Control e Dependency Inversion Principle sembrano essere confusi e usati come sinonimi (ulteriore confusione viene applicata dagli strumenti chiamati "DI-Containers" e "IoC-Containers") ). Un articolo di Wikipedia fa un buon lavoro cercando di spiegare che IoC non è lo stesso di DI:

inversion of control (IoC) describes a design in which custom-written portions of a computer program receive the flow of control from a generic, reusable library

Quindi il DIP si basa sul fatto che i tuoi moduli dipendono da astrazioni piuttosto che concrete implementazioni.

E IoC significa dare il controllo del flusso del programma a un modulo separato. E una delle cose che puoi fare questo modulo è risolvere le dipendenze in fase di runtime.

Questa differenza sembra giusta, ma non ho mai visto nessuno menzionare altre applicazioni del principio IoC diverso dalla risoluzione delle dipendenze. La definizione di Wikipedia è abbastanza ampia e sembra che tu possa fare molto di più con un modulo che può fare chiamate nel tuo codice personalizzato in base alla sua configurazione e ad alcune logiche interne.

Quindi, ecco alcune domande che non riesco ancora a capire:

  • Qual è la relazione effettiva tra IoC e DIP? IoC serve sempre come mezzo per implementare il DIP?
  • Perché gli strumenti per la risoluzione delle dipendenze chiamano contenitori DI- e IoC? Ciò implica che DI e IoC sono la stessa cosa.

Nota : questa domanda non è un duplicato di Qual è la differenza tra DI e IoC , perché quest'ultimo chiede informazioni sull'iniezione di dipendenza, non sull'inversione di dipendenza.

    
posta Andre Borges 03.03.2016 - 13:28
fonte

1 risposta

6

C'è un grande articolo sul sito di Martin Fowler che contiene un capitolo specifico sulla differenza tra DIP, DI e IoC . Il suo significato (come copiato da quel sito) è

DI is about how one object acquires a dependency. When a dependency is provided externally, then the system is using DI. IoC is about who initiates the call. If your code initiates a call, it is not IoC, if the container/system/library calls back into code that you provided it, is it IoC.

DIP, on the other hand, is about the level of the abstraction in the messages sent from your code to the thing it is calling. To be sure, using DI or IoC with DIP tends to be more expressive, powerful and domain-aligned, but they are about different dimensions, or forces, in an overall problem. DI is about wiring, IoC is about direction, and DIP is about shape.

    
risposta data 03.03.2016 - 14:45
fonte