Buscar..


Introducción

La idea general detrás de la inyección de dependencia es que usted diseña su aplicación en torno a componentes débilmente acoplados mientras se adhiere al principio de inversión de dependencia. Al no depender de implementaciones concretas, permite diseñar sistemas altamente flexibles.

Observaciones

La idea básica detrás de la inyección de dependencia es crear un código acoplado de forma más flexible. Cuando una clase, en lugar de crear sus propias dependencias, toma sus dependencias, la clase se vuelve más sencilla de probar como una unidad ( prueba de unidad ).

Para profundizar más en el acoplamiento flexible, la idea es que las clases se vuelvan dependientes de las abstracciones, en lugar de concreciones. Si la clase A depende de otra clase concreta B , entonces no hay pruebas reales de A sin B Si bien este tipo de prueba puede estar bien, no se presta al código de unidad comprobable. Un diseño débilmente acoplado definiría una abstracción IB (como ejemplo) de la cual dependería la clase A IB puede ser burlado para proporcionar un comportamiento comprobable, en lugar de confiar en la implementación real de B para poder proporcionar escenarios comprobables a A

Ejemplo estrechamente acoplado (C #):

public class A
{
    public void DoStuff()
    {
        B b = new B();
        b.Foo();
    }
}

En lo anterior, la clase A depende de B No hay pruebas A sin el hormigón B Si bien esto está bien en un escenario de pruebas de integración, es difícil realizar A prueba unitaria A

Una implementación más holgada de lo anterior podría ser:

public interface IB
{
    void Foo();
}

public class A
{
    private readonly IB _iB;

    public A(IB iB)
    {
        _iB = iB;
    }

    public void DoStuff()
    {
        _b.Foo();
    }
}

Las dos implementaciones parecen bastante similares, sin embargo hay una diferencia importante. La clase A ya no depende directamente de la clase B , ahora depende de IB . La Clase A ya no tiene la responsabilidad de renovar sus propias dependencias; ahora debe proporcionarlas a A

Inyección de Setter (C #)

public class Foo
{
    private IBar _iBar;
    public IBar iBar { set { _iBar = value; } }

    public void DoStuff()
    {
        _iBar.DoSomething();
    }
}

public interface IBar
{
    void DoSomething();
}

Inyección Constructor (C #)

public class Foo
{
    private readonly IBar _iBar;

    public Foo(IBar iBar)
    {
        _iBar = iBar;
    }

    public void DoStuff()
    {
        _bar.DoSomething();
    }
}

public interface IBar
{
    void DoSomething();
}


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow