Pregunta

Inversión de Control (o Coi) puede ser muy confuso cuando se encontró por primera vez.

  1. ¿Qué es?
  2. Que problema resuelve?
  3. Cuando es apropiado utilizar y cuándo no?
¿Fue útil?

Solución

La Inversión de Control (IoC) y la Inyección de dependencias (DI), los patrones son todos acerca de la eliminación de las dependencias de su código.

Por ejemplo, decir que la aplicación cuenta con un editor de texto del componente y desea proporcionar la corrección ortográfica.Su estándar de código sería algo como esto:

public class TextEditor {

    private SpellChecker checker;

    public TextEditor() {
        this.checker = new SpellChecker();
    }
}

Lo que hemos hecho aquí, se crea una dependencia entre el TextEditor y el SpellChecker.En un Coi escenario nos gustaría en lugar de hacer algo como esto:

public class TextEditor {

    private IocSpellChecker checker;

    public TextEditor(IocSpellChecker checker) {
        this.checker = checker;
    }
}

En el primer ejemplo de código estamos instanciando SpellChecker (this.checker = new SpellChecker();), lo que significa que el TextEditor clase depende directamente de la SpellChecker clase.

En el segundo ejemplo de código que estamos creando una abstracción por tener la SpellChecker clase de dependencia en TextEditor firma del constructor (no inicializar la dependencia en la clase).Esto nos permite llamar a la dependencia, a continuación, pasar al Editor de texto de la clase así:

SpellChecker sc = new SpellChecker; // dependency
TextEditor textEditor = new TextEditor(sc);

Ahora el cliente de la creación de la TextEditor la clase tiene el control sobre lo que SpellChecker aplicación para uso porque estamos inyectando la dependencia a la TextEditor de la firma.

Este es sólo un ejemplo sencillo, hay una buena serie de artículos por Simone Busoli que explica en mayor detalle.

Otros consejos

La inversión de Control es lo que usted consigue cuando su programa de devoluciones de llamada, por ejemplo,como una interfaz gráfica de usuario del programa.

Por ejemplo, en una antigua escuela de menú, usted puede tener:

print "enter your name"
read name
print "enter your address"
read address
etc...
store in database

así controlar el flujo de la interacción con el usuario.

En una interfaz gráfica de usuario del programa o somesuch, en cambio, nos dicen:

when the user types in field a, store it in NAME
when the user types in field b, store it in ADDRESS
when the user clicks the save button, call StoreInDatabase

Así que ahora el control está invertida...en lugar de la computadora de aceptar la entrada del usuario en un orden fijo, el usuario controla el orden en que se introducen los datos, y cuando los datos se guardan en la base de datos.

Básicamente, nada con un bucle de eventos, las devoluciones de llamada, o de ejecutar activadores cae en esta categoría.

¿Qué es la Inversión de Control?

Si usted sigue estos simples pasos, ustedes han hecho de la inversión de control:

  1. Independiente ¿a hacer parte de cuando-a parte.
  2. Asegúrese de que cuando parte sabe como poco como sea posible acerca de ¿ parte;y viceversa.

Hay varias técnicas posibles para cada uno de estos pasos basados en la tecnología/idioma que está utilizando para su implementación.

--

El la inversión parte de la Inversión de Control (IoC) es la confusión en la cosa;porque la inversión es el término relativo.La mejor manera de entender la Coi es olvidarse de esa palabra!

--

Ejemplos

  • Manejo De Eventos.Los Controladores de eventos (lo-que-hacer parte) -- Eventos de Recaudación (cuando a hacer parte)
  • Las Interfaces.Componente cliente (cuando a hacer parte) -- Componente de la Interfaz de la aplicación (lo-que-hacer parte)
  • xUnit accesorio.La instalación y Desmontaje (lo-que-hacer parte) -- xUnit marcos de llamadas para la Instalación en el principio y Desmontaje al final (cuando a hacer parte)
  • Plantilla de diseño de método patrón.método de plantilla cuando-a-parte -- primitiva, de la subclase de aplicación lo-que-hacer parte
  • DLL contenedor métodos en COM.DllMain, DllCanUnload, etc (lo-que-hacer parte) -- COM/OS (cuando a hacer parte)

La inversión de los Controles sobre la separación de preocupaciones.

Sin Coi:Usted tiene un portátil equipo y de rotura accidental de la pantalla.Y caramba, puede encontrar el mismo modelo en la pantalla del portátil es ningún lugar en el mercado.Así que usted está atascado.

Con El Coi:Usted tiene un escritorio equipo y de rotura accidental de la pantalla.Usted encontrará que usted puede simplemente tomar casi cualquier monitor de escritorio del mercado, y funciona bien con el escritorio.

Su escritorio con éxito implementa la Coi en este caso.Se acepta una variedad de tipo de monitores, mientras que el portátil no, se necesita una pantalla específica para que queden fijos.

Inversión de Control (o Coi), se trata de conseguir la libertad (Se casaron, se pierde la libertad y están siendo controlados.Se ha divorciado, se han implementado de Inversión de Control.Eso es lo que se llama "desconectados".Buen sistema informático desalienta a algunos muy estrecha relación.) más flexibilidad (La cocina en su oficina sólo sirve para limpiar el agua del grifo, que es su única opción cuando se quiere beber.Su jefe implementado Inversión de Control mediante el establecimiento de una nueva máquina de café.Ahora puede obtener la flexibilidad de elegir el agua del grifo o de café.) y menos dependencia (Su pareja tiene un trabajo, usted no tiene un trabajo, que económicamente dependen de su pareja, por lo que son controlados.Encontrar un puesto de trabajo, se ha implementado la Inversión de Control.Buen sistema informático alienta en la dependencia.)

Cuando se utiliza un ordenador de sobremesa, que ha esclavizado (o dicen, controlado).Usted tiene que sentarse delante de una pantalla y vistazo.Usar el teclado para escribir y utilizar el ratón para navegar.Y un mal escrita, software de esclavos aún más.Si reemplazar su escritorio con un ordenador portátil, entonces usted algo invertida de control.Usted puede tomar fácilmente y moverse.Así que ahora usted puede controlar su equipo, en lugar de su ordenador que lo controla.

Mediante la aplicación de la Inversión de Control, un software/objeto de los consumidores obtener más controles y opciones sobre el software/objetos, en lugar de ser controlado o tener menos opciones.

Con las ideas anteriores en mente.Echamos de menos una parte clave de la Coi.En el escenario de la Coi, el software/objeto de consumo es un sofisticado marco.Eso significa que el código que ha creado es que no se llama por ti mismo.Ahora vamos a explicar por qué esto funciona mejor para una aplicación web.

Supongamos que el código es un grupo de trabajadores.Que necesitan para construir un coche.Estos trabajadores necesitan un lugar y herramientas (un framework de software) para construir el coche.Un tradicional framework de software será como un garaje con muchas herramientas.Por lo que los trabajadores necesitan para hacer un plan a sí mismos y a utilizar las herramientas para construir el coche.La construcción de un coche no es un negocio fácil, va a ser muy difícil para los trabajadores para planificar y cooperar adecuadamente.Un moderno framework de software será como una moderna fábrica de coches con todas las instalaciones y los gerentes en el lugar.Los trabajadores no tienen que hacer ningún plan, los gerentes (parte del marco, son la gente más inteligente y el más sofisticado plan) ayudará a coordinar para que los trabajadores sepan cuándo hacer su trabajo (framework llama a su código).Los trabajadores sólo necesitan ser lo suficientemente flexible para utilizar cualquiera de las herramientas de los gerentes dan a ellos (mediante el uso de Inyección de dependencias).

Aunque la dan los trabajadores el control de la gestión del proyecto en el nivel superior a los gerentes (el marco).Pero es bueno tener algunos profesionales de la ayuda.Este es el concepto de la Coi realmente vienen.

Modernas aplicaciones Web con una arquitectura MVC depende del marco para hacer Enrutamiento de dirección URL y poner los Controladores en el lugar para el marco de la llamada.

La Inyección de dependencias e Inversión de Control están relacionadas.La Inyección de dependencia es en el micro nivel y de la Inversión de Control es en la macro nivel.Usted tiene que comer cada bocado (implementar DI) para finalizar una comida (implementar Coi).

Antes de utilizar la Inversión de Control, usted debe ser consciente del hecho de que tiene sus pros y sus contras y que usted debe saber por qué lo use si usted hacerlo.

Pros:

  • Su código se obtiene desacoplado por lo que pueden intercambiar fácilmente las implementaciones de un interfaz con las implementaciones alternativas
  • Es una fuerte motivación para la codificación en contra de las interfaces en lugar de implementaciones
  • Es muy fácil escribir pruebas unitarias para el código, pues no depende de nada más que en los objetos que éste acepta en su constructor/setters y fácilmente se pueden inicializar con el derecho de objetos en el aislamiento.

Contras:

  • Coi no sólo invierte el flujo de control en el programa, también las nubes considerablemente.Esto significa que usted puede no sólo leer el código y saltar de un lugar a otro debido a las conexiones que normalmente estaría en tu código no están en el código de más.Es en cambio en los archivos de configuración XML o anotaciones y en el código de su contenedor de IoC que interpreta estos metadatos.
  • Surge una nueva clase de errores donde obtener su configuración XML o sus anotaciones mal y usted puede pasar un montón de tiempo a la búsqueda del por qué de su contenedor de IoC inyecta una referencia nula en uno de los objetos bajo ciertas condiciones.

Personalmente veo los puntos fuertes de la Coi y que realmente les gusta, pero que tienden a evitar la Coi siempre que sea posible, ya que convierte su software en una colección de clases que ya no constituyen una "real" del programa, pero sólo es algo que debe ser elaborado por XML de configuración o anotación de los metadatos y la iba a caer (y caídas) aparte sin ella.

  1. Artículo De La Wikipedia.Para mí, la inversión de control es dar forma secuencial código escrito y que se convierta en una delegación de la estructura.En lugar de su programa explícitamente el control de todo, el programa establece una clase o en la biblioteca con ciertas funciones a ser llamado cuando ocurren ciertas cosas.

  2. Se resuelve la duplicación de código.Por ejemplo, en los viejos tiempos, usted podría escribir su propio bucle de eventos, encuestas el sistema de bibliotecas para nuevos eventos.Hoy en día, la mayoría de los modernos Api basta con indicar el sistema de bibliotecas de qué eventos están interesados en, y se le hará saber cuando se producen.

  3. La inversión de control es una manera práctica de reducir la duplicación de código, y si usted se encuentra la copia de un método completo y sólo a cambio de una pequeña pieza de código, puede considerar la posibilidad de abordar con la inversión de control.La inversión de control es fácil en muchos idiomas a través del concepto de delegados, interfaces, o incluso cruda punteros a función.

    No es apropiado para el uso en todos los casos, debido a que el flujo de un programa puede ser más difícil de seguir cuando se escribe de esta manera.Es una manera útil para el diseño de métodos cuando se escribe una biblioteca que va a ser reutilizado, pero debe ser usado con moderación en el núcleo de su propio programa, a menos que realmente resuelve un código de problema de duplicación.

Pero creo que tienes que ser muy cuidadoso con ello.Si usted va a un uso excesivo de este patrón, se hará muy complicado diseño y complica aún más el código.

Como en este ejemplo con el Editor de texto:si sólo tiene un corrector ortográfico que quizá no es realmente necesario el uso de Coi ?A menos que usted necesita para escribir pruebas unitarias o algo ...

De todos modos:ser razonable.Patrón de diseño son buenas prácticas pero no de la Biblia para ser predicado.No se adhieren a todas partes.

Suponga que usted es un objeto.Y usted va a un restaurante:

Sin Coi:usted puede pedir el "apple", y que se sirven siempre de apple cuando le pides más.

Con El Coi:Usted puede pedir el "fruto".Usted puede obtener frutas diferentes cada vez que servido.por ejemplo, una manzana, una naranja o melón de agua.

Por lo que, obviamente, Coi es preferido al igual que el de las variedades.

Coi / DI me está empujando hacia fuera de las dependencias de la vocación de los objetos.Super simple.

La no-techy respuesta es ser capaz de cambiar el motor de un coche justo antes de encenderlo.Si todo ganchos arriba a la derecha (la interfaz), que son buenos.

  1. La inversión de control es un patrón que se usa para separar los componentes y capas en el sistema.El modelo es implementado a través de la inyección de dependencias en un componente cuando se construye.Estas dependencias son prestados normalmente como interfaces para una mayor disociación y apoyar la capacidad de prueba.Coi / DI recipientes, tales como el Castillo de Windsor, la Unidad son herramientas (bibliotecas) que puede ser utilizado para la prestación del Coi.Estas herramientas proporcionan características extendidas por encima y más allá de la simple gestión de la dependencia, incluyendo toda la vida, AOP / Intercepción, política, etc.

  2. una.Alivia un componente de la responsabilidad para la gestión de dependencias.
    b.Proporciona la capacidad de intercambio de dependencia de las implementaciones en diferentes entornos.
    c.Permite que un componente se prueba a través de las burlas de las dependencias.
    d.Proporciona un mecanismo para el intercambio de recursos a través de una aplicación.

  3. una.Crítica al hacer test-driven development.Sin Coi puede ser difícil de probar, ya que los componentes bajo prueba son altamente junto con el resto del sistema.
    b.Crítica al desarrollo de sistemas modulares.Un sistema modular es un sistema cuyos componentes pueden ser reemplazados sin necesidad de recompilación.
    c.Crítica si hay muchas cuestiones transversales que deben abordarse, partilarly en una aplicación empresarial.

Voy a escribir mi simple comprensión de estos dos términos:

For quick understanding just read examples*

La Inyección de dependencias(DI):
La inyección de dependencia, generalmente, significa que pasar un objeto en el que el método depende, como un parámetro a un método, en lugar de tener el método de crear el objeto dependiente.
Lo que significa en la práctica es que el método no depende directamente de una implementación particular;cualquier aplicación que cumpla con los requisitos puede ser pasado como parámetro.

Con este objeto dígale a sus dependencias.Y la primavera hace disponible.
Esto conduce a un acoplamiento flexible el desarrollo de la aplicación.

Quick Example:EMPLOYEE OBJECT WHEN CREATED,
              IT WILL AUTOMATICALLY CREATE ADDRESS OBJECT
   (if address is defines as dependency by Employee object)

Inversión de Control(IoC) Contenedor:
Esta es una característica común de los marcos, COI gestiona objetos java
– a partir de la creación de instancias para la destrucción a través de su BeanFactory.
-Componentes de Java que se crea una instancia por el contenedor de IoC son llamados frijoles, y el Contenedor de IoC gestiona un bean del ámbito de los eventos del ciclo de vida, y cualquier AOP características para el que ha sido configurado y codificado.

QUICK EXAMPLE:Inversion of Control is about getting freedom, more flexibility, and less dependency. When you are using a desktop computer, you are slaved (or say, controlled). You have to sit before a screen and look at it. Using keyboard to type and using mouse to navigate. And a bad written software can slave you even more. If you replaced your desktop with a laptop, then you somewhat inverted control. You can easily take it and move around. So now you can control where you are with your computer, instead of computer controlling it.

Mediante la aplicación de la Inversión de Control, un software/objeto de los consumidores obtener más controles y opciones sobre el software/objetos, en lugar de ser controlado o tener menos opciones.

La inversión de control como una guía de diseño sirve para los siguientes propósitos:

Hay una disociación de la ejecución de una determinada tarea de implementación.
Cada módulo pueda centrarse en lo que está diseñado.
Los módulos no hacer suposiciones acerca de lo que otros sistemas, pero confían en sus contratos.
Sustitución de módulos no tiene ningún efecto en otros módulos
Voy a mantener las cosas abstractas aquí, Usted puede visitar los siguientes enlaces para el detalle comprensión del tema.
Una buena lectura con el ejemplo

Explicación detallada

Responder sólo la primera parte.¿Qué es?

Inversión de Control (IoC) para crear instancias de las dependencias de primera y última instancia de una clase (opcionalmente inyección de ellos a través de constructor), en lugar de crear una instancia de la clase primero y, a continuación, la instancia de la clase la creación de instancias de las dependencias.Por lo tanto, la inversión de control invierte el flujo de control de el programa. En lugar de el llamado control de el flujo de control (mientras que la creación de dependencias), el llamada controla el flujo de control del programa.

Por ejemplo, la tarea#1 es para crear el objeto.Sin COI concepto, tarea#1 se supone que debe hacer por el Programador.Pero Con el COI concepto, tarea#1 sería hecho por contenedor.

En pocas palabras, el Control se invierte a partir de Programador contenedor.Así, se llama como la inversión de control.

He encontrado un buen ejemplo aquí.

Vamos a decir que hacemos una reunión en algún hotel.

Muchas personas, muchos de garrafas de agua, muchos vasos de plástico.

Cuando alguien quiere beber, ella llene una taza, beber y tirar de la copa en el suelo.

Después de una hora o algo que tiene un suelo cubierto de vasos de plástico y agua.

Vamos a invertir control.

La misma reunión en el mismo lugar, pero en lugar de vasos de plástico disponemos de un camarero con un vaso de vidrio (Singleton)

y ella todo el tiempo ofrece a los huéspedes de beber.

Cuando alguien quiere beber, ella recibe de camarero de vidrio, beber y volver a camarero.

Dejando de lado la cuestión de la higiene, la última forma de beber el control del proceso es mucho más eficaz y económica.

Y esto es exactamente lo que la Primavera (otro contenedor de IoC, por ejemplo:Guice) no.En lugar de dejar que la aplicación crear lo que es necesario el uso de nuevas palabras clave (tomando un vaso de plástico), Primavera contenedor de IoC todos de oferta para la aplicación de la misma instancia (singleton) de objeto necesario(vaso de agua).

Piensa en ti mismo como organizador de la reunión.Usted necesita la forma del mensaje a la administración del hotel que

reunión de los miembros tendrá vaso de agua, pero no pedazo de la torta.

Ejemplo:-

public class MeetingMember {

    private GlassOfWater glassOfWater;

    ...

    public void setGlassOfWater(GlassOfWater glassOfWater){
        this.glassOfWater = glassOfWater;
    }
    //your glassOfWater object initialized and ready to use...
    //spring IoC  called setGlassOfWater method itself in order to
    //offer to meetingMember glassOfWater instance

}

Enlaces útiles:-

Estoy de acuerdo con NilObject, pero me gustaría añadir a esta:

si usted se encuentra la copia de un método completo y sólo a cambio de una pequeña pieza de código, puede considerar la posibilidad de abordar con la inversión de control

Si usted se encuentra copiar y pegar el código a su alrededor, estás casi siempre haciendo algo mal.Codificado como el principio de diseño Sólo una vez y Sólo una Vez.

Parece que lo más confuso acerca de "el Coi", la sigla y el nombre por el que se levanta es que es demasiado glamour de un nombre - casi un ruido de nombre.

¿Realmente necesitamos un nombre por el que se describa la diferencia entre procedimiento y controlada por eventos de la programación?OK, si lo que necesitamos, pero tenemos que escoger una nueva marca "más grande que la vida", nombre que confunde más de lo que lo soluciona?

La coi es acerca de la inversión de la relación entre el código y el código de terceros (librería/framework):

  • En condiciones normales de s/w de desarrollo, se escribe el main() método y de la llamada "biblioteca" de los métodos. Usted control :)
  • En la Coi el "marco" de los controles de main() y llama a los métodos.El Marco es en el control de :(

DI (Inyección de dependencias) es acerca de cómo los flujos de control en la aplicación.La tradicional aplicación de escritorio tenía el control de flujo de la aplicación(método main ()) a otro método de la biblioteca de llamadas, pero con DI de control de flujo se invierte ese marco se encarga de iniciar su aplicación, la inicialización y la invocación de sus métodos cuando sea necesario.

Al final siempre gana :)

La inversión de control es cuando vas a la tienda de comestibles y a su esposa le da la lista de productos a comprar.

En términos de programación, ella pasó una función de devolución de llamada getProductList() a la función se ejecuta - doShopping().

Esto permite que el usuario de la función de definir algunas partes de la misma, haciéndola más flexible.

Una muy simple explicación por escrito se puede encontrar aquí

http://binstock.blogspot.in/2008/01/excellent-explanation-of-dependency.html

Se dice -

"Cualquier no-trivial de la aplicación se compone de dos o más clases que colaborar unos con otros para realizar algunos de la lógica de negocio.Tradicionalmente, cada objeto es responsable de la obtención de su propio las referencias a los objetos que colabora con (sus dependencias).Cuando la aplicación de DI, los objetos son dados sus dependencias en la creación de tiempo con alguna entidad externa que las coordenadas de cada objeto en el sistema.En otras palabras, las dependencias se inyecta en los objetos."

La inversión de Control es un principio genérico, mientras que la Inyección de Dependencia se da cuenta de este principio como un patrón de diseño gráfico del objeto de la construcción (es decir,los controles de configuración de cómo los objetos se hace referencia a cada uno de los otros, más que el objeto en sí mismo el control de cómo obtener la referencia a otro objeto).

Buscando en la Inversión de Control como un patrón de diseño, tenemos que mirar a lo que estamos invirtiendo.La Inyección de dependencia invierte control de la construcción de un gráfico de objetos.Si dicho en otras término, de la inversión de control implica un cambio en el flujo de control en el programa.Por ejemplo.En la tradicional aplicación independiente, hemos método principal, desde donde el control se pasa a otras bibliotecas de terceros(en el caso, hemos utilizado la tercera parte de la biblioteca de la función), sino a través de la inversión de control el control se transfiere de la tercera parte de la biblioteca de código para el código, ya que estamos dando el servicio de biblioteca de terceros.Pero hay otros aspectos que deben ser invertida dentro de un programa - por ejemplo,la invocación de métodos y subprocesos para ejecutar el código.

Para aquellos interesados en más profundidad en la Inversión de Control que un documento ha sido publicado esbozar un panorama más completo de la Inversión de Control como un patrón de diseño (OfficeFloor:el uso de office patrones para mejorar el diseño de software http://doi.acm.org/10.1145/2739011.2739013 con una copia gratuita disponible para su descarga desde http://www.officefloor.net/about.html).

Lo que se identifica es la siguiente relación:

Inversión de Control (para los métodos) = Dependencia (estado) de la Inyección + Continuación de la Inyección + Hilo de la Inyección

Resumen de la relación anterior para la Inversión de Control disponibles http://dzone.com/articles/inversion-of-coupling-control

He encontrado un ejemplo muy claro aquí lo que explica el modo en que el control es invertida'.

Clásico de código (sin inyección de Dependencia)

Aquí es cómo un código no utilizar DI más o menos será el trabajo:

  • Las necesidades de la aplicación Foo (por ejemplo,un controlador), así:
  • La aplicación crea Foo
  • La aplicación llama a Foo
    • Foo necesidades de la Barra (por ejemplo,una de servicio), así:
    • Foo crea Bar
    • Foo llamadas Bar
      • Bar necesidades Bim (un servicio, un repositorio, ...), así:
      • Bar crea Bim
      • Bar hace algo

El uso de inyección de dependencias

Aquí es cómo un código mediante el uso de DI más o menos será el trabajo:

  • Las necesidades de la aplicación Foo, que necesita de la Barra, que necesita Bim, así:
  • La aplicación crea Bim
  • La aplicación crea la Barra y le da Bim
  • La aplicación crea Foo y le da Barra
  • La aplicación llama a Foo
    • Foo llamadas Bar
      • Bar hace algo

El control de las dependencias se invierte de un ser llamado a la vocación.

¿Qué problemas resuelve?

La inyección de dependencia facilita el intercambio con la diferente aplicación de la inyección de clases.Mientras que las pruebas de unidad se puede inyectar un maniquí de aplicación, lo que hace que la prueba sea mucho más fácil.

Ex:Suponga que la aplicación almacena el usuario carga el archivo en Google Drive, con DI su controlador de código puede tener este aspecto:

class SomeController
{
    private $storage;

    function __construct(StorageServiceInterface $storage)
    {
        $this->storage = $storage;
    }

    public function myFunction () 
    {
        return $this->storage->getFile($fileName);
    }
}

class GoogleDriveService implements StorageServiceInterface
{
    public function authenticate($user) {}
    public function putFile($file) {}
    public function getFile($file) {}
}

Cuando cambian sus requerimientos decir, en lugar de GoogleDrive se le pide que utilice el Dropbox.Sólo se necesita escribir un dropbox aplicación para el StorageServiceInterface.No se han de hacer cualquier cambio en el controlador mientras Dropbox aplicación se adhiere a la StorageServiceInterface.

Mientras que la prueba puede crear la maqueta para el StorageServiceInterface con el maniquí de la aplicación donde todos los métodos devuelven null(o cualquier valor predefinido como por su exigencia de pruebas).

En cambio, si usted tenía la clase de controlador para construir el objeto de almacenamiento con la new palabra clave como este:

class SomeController
{
    private $storage;

    function __construct()
    {
        $this->storage = new GoogleDriveService();
    }

    public function myFunction () 
    {
        return $this->storage->getFile($fileName);
    }
}

Cuando usted desea cambiar con el Dropbox aplicación, usted tiene que reemplazar todas las líneas donde new GoogleDriveService objeto es construido y el uso de la DropboxService.Además, cuando las pruebas de la SomeController la clase, el constructor siempre se espera que el GoogleDriveService de la clase y los métodos de esta clase son provocados.

Cuando es apropiado y cuando no? En mi opinión, el uso de DI cuando piensa que hay (o puede haber) implementaciones alternativas de una clase.

Programación de hablar

La coi en términos fáciles:Es el uso de la Interfaz como una forma específica de algo (por ejemplo un campo o de un parámetro) como un comodín que puede ser utilizado por algunas clases.Permite la re-utilización del código.

Por ejemplo, supongamos que tenemos dos clases : Perro y Gato.Tanto comparte las mismas cualidades o estados:la edad, tamaño, peso.Así que en lugar de crear una clase de servicio con el nombre de DogService y CatService, Puedo crear una sola llamada AnimalService que permite el uso de Perro y Gato sólo si se usa la interfaz de IAnimal.

Sin embargo, pragmáticamente hablando, tiene algunas hacia atrás.

a) La mayoría de los desarrolladores no saben cómo usarlo.Por ejemplo, puedo crear una clase llamada Cliente y Puedo crear automáticamente (el uso de las herramientas del IDE) con una interfaz llamada ICustomer.Así, no es raro encontrar una carpeta llena de clases e interfaces, no importa si las interfaces serán reutilizados o no.Se llama HINCHADO.Algunas personas podrían argumentar que "puede ser en el futuro podríamos usarlo".:-|

b) tiene algunas limitings.Por ejemplo, vamos a hablar sobre el caso de Perro y Gato y quiero agregar un nuevo servicio (funcionalidad) sólo para los perros.Digamos que quiero calcular el número de días que necesito para entrenar a un perro (trainDays()), para el gato es inútil, los gatos no pueden ser entrenados (estoy bromeando).

b.1) Si puedo agregar trainDays() para el Servicio de AnimalService a continuación, se trabaja también con los gatos y no es válida en absoluto.

b.2) puedo agregar una condición en la trainDays() donde se evalúa la clase que se utiliza.Pero va a romper por completo el Coi.

b.3) puedo crear una nueva clase de servicio llamado DogService sólo para la nueva funcionalidad.Pero, además de aumentar la mantenibilidad del código, porque vamos a tener dos clases de servicio (con funcionalidad similar) para Perro y es malo.

Me gusta esta explicación: http://joelabrahamsson.com/inversion-of-control-an-introduction-with-examples-in-net/

Se comienza simple y muestra ejemplos de código así.

enter image description here

El consumidor, X, las necesidades de consumo de la clase, Y, para lograr algo.Todo eso es bueno y natural, pero no X realmente necesita saber que se utiliza Y?

¿No es suficiente que X sabe que utilice algo que tiene el comportamiento, los métodos, propiedades etc, Y sin saber que en realidad implementa el comportamiento?

Mediante la extracción de una definición abstracta de la conducta de usado por X en Y, se ilustra como yo abajo, y dejar que el consumidor X utiliza una instancia de la que, en lugar de Y se puede seguir haciendo lo que hace, sin tener que conocer los detalles acerca de Y.

enter image description here

En la ilustración de arriba Y implementa I y X, se utiliza una instancia de la I.Mientras que es muy posible que X todavía se utiliza Y lo que es interesante es que X no saber que.Sólo se sabe que se utiliza algo que implementa I.

Lea el artículo para más información y descripción de beneficios tales como:

  • X no depende de Y más
  • Más flexible, su implementación puede ser decidido en tiempo de ejecución
  • El aislamiento de la unidad de código, más fácil de pruebas

...

Entiendo que la respuesta ya ha sido dada aquí.Pero todavía creo que, algunos conceptos básicos acerca de la inversión de control tiene que ser discutido aquí en longitud para los lectores futuros.

Inversión de Control (IoC) ha sido construido en un principio muy simple llamado Hollywood Principio.Y dice que,

No nos llame, nosotros lo llamaremos

Lo que significa es que no vaya a Hollywood para cumplir su sueño más si son dignos de Hollywood va a encontrar usted y hacer su sueño viene verdad.Bastante invertida, ¿eh?

Ahora, cuando se discute sobre el principio de la Coi, que usamos para olvidarse de Hollywood.Para el Coi, tiene que haber tres elementos, un hotel de Hollywood, a usted y a una tarea como para cumplir su sueño.

En nuestro mundo de la programación, Hollywood representan un marco genérico (puede ser por escrito o de otra persona), usted representan el código de usuario que usted escribió y la tarea representan lo que usted desea lograr con su código.Ahora no se te ocurra ir a desencadenar su tarea por sí mismo, no en la Coi!Sino que todo ha sido diseñado de tal manera que su marco se disparará su tarea para usted.Así, se han construido una reutilizables marco de lo que puede hacer a alguien un héroe o de otro villano.Pero ese marco se encarga siempre, sabe cuando para recoger a alguien y ese alguien solo sabe lo que quiere ser.

Un ejemplo de la vida real sería dado aquí.Supongamos, usted desea desarrollar una aplicación web.Así, se crea un marco de trabajo que se encargará de todas las cosas comunes de una aplicación web debe manejar como el manejo de la solicitud http, la creación de menú de la aplicación, sirviendo páginas, manejo de cookies, activación de eventos, etc.

Y a continuación te dejo algunos ganchos en su marco, donde usted puede poner más códigos para generar menú personalizado, las páginas, las cookies o el registro de algunos eventos de usuario, etc.En cada solicitud de navegador, su marco de ejecución y ejecuta sus códigos personalizados si enganchado luego servir en el navegador.

Así, la idea es bastante simple.En lugar de crear una aplicación de usuario que tendrá el control de todo, en primer lugar, crear un reutilizables marco de control de todo, a continuación, escribir sus códigos personalizados y el gancho para el marco para la ejecución de aquellos en el tiempo.

Laravel y EJB son ejemplos de tales marcos.

Referencia:

https://martinfowler.com/bliki/InversionOfControl.html

https://en.wikipedia.org/wiki/Inversion_of_control

La inversión de control es acerca de la transferencia de control de la biblioteca para el cliente.Tiene más sentido cuando hablamos de un cliente que se inyecta (pasa) un valor de la función (expresión lambda) en un orden superior de la función (función de biblioteca) que controla los cambios en el comportamiento de la función de la biblioteca.Un cliente o un marco de trabajo que inyecta dependencias de la biblioteca (que llevan comportamiento) en las bibliotecas también pueden ser considerados Coi

  1. Por lo que el número 1 por encima de. ¿Qué es la Inversión de Control?

  2. El mantenimiento es el número de una cosa se resuelve para mí.Garantiza estoy usando interfaces de modo que dos clases no son íntima con cada uno de los otros.

En el uso de un recipiente como el Castillo de Windsor, que resuelve los problemas de mantenimiento aún mejor.Ser capaz de intercambiar un componente que va a una base de datos para uno que usa el archivo de base de persistencia sin cambiar una línea de código es impresionante (cambio en la configuración, ya está hecho).

Y una vez que te metes en los genéricos, se pone aún mejor.Imagine tener un publicador del mensaje que recibe los datos y publica mensajes.No importa lo que se publica, pero se necesita un mapper para tomar algo a partir de un registro a un mensaje.

public class MessagePublisher<RECORD,MESSAGE>
{
    public MessagePublisher(IMapper<RECORD,MESSAGE> mapper,IRemoteEndpoint endPointToSendTo)
    {
      //setup
    }
}

Lo escribí una vez, pero ahora puedo inyectar muchos tipos dentro de este conjunto de código si puedo publicar diferentes tipos de mensajes.También puedo escribir mappers que tomar un registro del mismo tipo y asignarlos a los diferentes mensajes.Usando DI con medicamentos Genéricos me ha dado la capacidad de escribir muy poco código para realizar muchas tareas.

Oh, sí, hay la capacidad de prueba de preocupaciones, pero son secundarios a los beneficios de la Coi/DI.

Definitivamente soy amante de la Coi/DI.

3 .Es más apropiado el minuto tienes un proyecto de tamaño medio de algo más de complejidad.Yo diría que resulta apropiado el momento de empezar a sentir dolor.

La creación de un objeto dentro de la clase se llama acoplamiento, la Primavera, lo que elimina esta dependencia siguiendo un patrón de diseño(DI/COI).En el que un objeto de la clase en el pasado en el constructor en lugar de crear en la clase.Más encima nos dan super clase de variable de referencia en el constructor para definir de forma más general de la estructura.

El uso de la Coi que no son nuevos ing de seguridad de sus objetos.Su contenedor de IoC va a hacer eso y administrar la vida de ellos.

Se resuelve el problema de tener que cambiar manualmente cada instancia de un tipo de objeto a otro.

Es conveniente cuando usted tiene una funcionalidad que puede cambiar en el futuro o que puede ser diferente dependiendo del entorno o de la configuración utilizada en.

Para entender el concepto, la Inversión de Control (IoC) o Dependencia Principio de la Inversión (DIP) involucra dos actividades:la abstracción y la inversión.La Inyección de dependencias (DI) es uno de los pocos de la inversión de los métodos.

Para leer más acerca de esto usted puede leer mi blog Aquí

  1. ¿Qué es?

Es una práctica donde dejas el comportamiento real vienen de fuera de los límites (de la Clase de Programación Orientada a Objetos).El límite de la entidad sólo se conoce la abstracción (e.g interfaz, clase abstracta, delegado en Programación Orientada al Objeto) de la misma.

  1. ¿Qué problemas resuelve?

En términos de programación, Coi tratar de resolver un código monolítico por lo que es modular, la disociación de varias partes del mismo, y hacer que la unidad comprobables.

  1. Cuando es apropiado y cuando no?

Es apropiado que la mayoría de las veces, a menos que usted tiene de la situación donde sólo se desea un código monolítico (e.g programa muy simple)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top