L'inversione di dipendenza include sempre l'iniezione di dipendenza? [chiuso]

3

Questa è una domanda su un lavoro a casa. Sono stato su e giù per i miei appunti e non riesco nemmeno a vedere come i due sono correlati. Googling questo mi dà domande / risposte su uno o l'altro, ma mai entrambi.

    
posta user106857 04.11.2013 - 17:34
fonte

4 risposte

8

L'iniezione di dipendenza è una tecnica per implementare Dependency Inversion.

La pagina Inversion of Control su Wikipedia in realtà lo dice un po 'meglio, anche se Dependency Inversion and Inversion of Il controllo potrebbe non essere esattamente la stessa cosa.

Ecco cosa dice:

Implementation Techniques

In object-oriented programming, there are several basic techniques to implement inversion of control. These are:

  • using a factory pattern
  • using a service locator pattern
  • using a dependency injection, for example:

    • Constructor injection
    • Parameter injection
    • Setter injection
    • Interface injection
  • using a contextualized lookup
  • using Template method design pattern
  • using Strategy design pattern

Quindi no, Dependency Inversion non è l'unico modo per realizzare Dependency Inversion.

    
risposta data 04.11.2013 - 18:11
fonte
8

Risposta: No. Ecco la differenza:

Dependency Inversion è un principio .

High-level modules should not depend on low-level modules. Both should depend on abstractions. Abstractions should not depend on details. Details should depend on abstractions.

L'iniezione delle dipendenze è una tecnica , quindi le dipendenze, piuttosto le loro astrazioni, sono esplicitamente iniettate in un oggetto, tipicamente nel costruttore, ma a volte esposte come proprietà. Questo può essere fatto con DI povero uomo o con un contenitore IoC strong> .

Esempio di DI povero:

public class ConsumingClass
{
    private readonly ISomeService SomeService;

    public ConsumingClass(ISomeService someService)
    {
        SomeService = someService ?? new SomeServiceConcrete().
    }

    /* use SomeService elsewhere in the class */
}

Esempio di DI con IoC:

public class ConsumingClass
{
    private readonly ISomeService SomeService;

    public ConsumingClass(ISomeService someService)
    {
        SomeService = someService.
    }

    /* use SomeService elsewhere in the class */
}

Il Pattern Locator del servizio , a differenza di Iniezione delle dipendenze, richiede all'oggetto di chiedere a un servizio le sue dipendenze. Questo è considerato un anti-modello. I dettagli del perché vanno oltre lo scopo della domanda e sono lasciati come esercizio per il lettore.

Esempio di localizzatore di servizio:

public class ConsumingClass
{
    private readonly ISomeService SomeService;

    public ConsumingClass()
    {
        SomeService = SomeServiceLocator.GetInstance<ISomeService>();
    }

    /* use SomeService elsewhere in the class */
}
    
risposta data 04.11.2013 - 18:13
fonte
0

La pagina wiki su Principio di inversione delle dipendenze dice:

Various patterns such as Plugin, Service Locator, or Dependency Injection are then employed to facilitate the run-time provisioning of the chosen low-level component implementation to the high-level component.

Pertanto, la risposta è: l'iniezione di dipendenza è una tecnica per applicare il principio di inversione di dipendenza, ma non è l'unico.

Esistono altre tecniche quando si desidera utilizzare questo principio (la pagina wiki collegata elenca i plugin e il localizzatore di servizio come tecniche aggiuntive).

L'iniezione di dipendenza è un tipo specifico di inversione del controllo in un modo in cui in qualche modo si inietta un oggetto di livello inferiore in un oggetto di livello superiore. In questo modo, l'oggetto di livello superiore dipende da un'astrazione e non dall'implementazione concreta di un oggetto di livello inferiore. In altre parole, accede ad un oggetto attraverso la sua interfaccia (solitamente astratta).

    
risposta data 04.11.2013 - 17:45
fonte
-3

La semplice risposta alla tua domanda è "No, l'iniezione delle dipendenze non è sempre presente quando si utilizza Dependency Inversion".

In poche parole, "Dependency Inversion" è il principio e "Dependency Injection" è solo un metodo di implementazione. Come notato in un'altra risposta, ci sono altre implementazioni del principio che includono Service Locator e Plug-In Frameworks.

    
risposta data 04.11.2013 - 18:15
fonte

Leggi altre domande sui tag