12

He estado programando por algún tiempo pero nunca me interesó saber en teoría lo que significa cada concepto, puedo estar usando una variedad de conceptos de programación, pero sin saber eso.Localizador de servicios, Inyección de dependencia (y contenedor) e Inversión de control

Localizador de servicios: Para mí, se refiere a un registro de accesos directos para acelerar el desarrollo al reducir la cantidad de código. Una pregunta es: ¿puede Locator referirse a espacios de nombre/clases solamente, o puedo tener un registro de variables?

Aquí es mi comprensión de la misma:

$locator = new ServiceLocator() 
$locator->set('app', new System\Application()); 
$locator->set('db', new System\Pdo()); 

// Get the objects 
$locator->get('db')->connect(); 
$locator->get('app')->run(); 

inyección de dependencias (y la inyección de dependencias del envase): La inyección de objetos dentro de objetos, lo que permite un acceso más rápido a éstas independientemente del patrón de fábrica. ¿Y DI Container?

Aquí es mi comprensión de la misma:

$app = new System\Application(System\Config::load()); 

Inversión de Control: No entiendo esto del diseño del modelo (o entender, pero no sé si lo que hago es COI)

Luego, en teoría (preferiblemente con ejemplos simples), ¿qué significa cada uno de estos conceptos? ¿Estoy en lo correcto o lo que está mal/se puede mejorar?

Gracias!

+0

No está seguro de lo que entendemos por "un acceso más rápido." Las variables globales o singletons serían igual de rápidas. Creo que de lo que estás hablando es más acerca de la modularidad. – landons

+0

Cuando tengo una DI, toda la clase se inyecta dentro de otra, por lo tanto, no necesito otro patrón de diseño porque tengo todo lo que necesito dentro de mi segunda clase. (¿Entiendes ?!) –

+0

Espera un minuto ... ¿quién hace las preguntas aquí? : P – landons

Respuesta

9

Creo que entendió correctamente el Localizador de servicios.

Sobre inyección de dependencias, significa que si un objeto tiene constructor y/o de propiedad dependencias, estos son inyectados en el objeto por fuera, en oposición al objeto conseguir las dependencias por sí mismo

public class MyClass 
{ 
    private $_dep; 
    public function __construct($dep=null) 
    { 
     //$dep has to be injected 
     $this->_dep=$dep;       
    } 

    //this is wrong because it couples MyClass to a specific Dependency implementation 
    public function __construct() 
    { 
     $this->_dep=new Dependency(); 
    } 
} 
    $dep=new Dependency(); 
    $obj=new MyClass($dep); 

Por lo general, el constructor toma una abstracción (una interfaz) como parámetro, y fuera de la clase se crea una implementación concreta que luego se pasa al constructor cuando se crea una nueva instancia de MyClass.

A DI Container, maneja la inyección de dependencia automáticamente. Simplemente configúralo, para que sepa qué clases concretas se devolverán cuando se solicite una abstracción. El contenedor maneja la creación de objetos, inyectando dependencias a través del constructor y/o propiedades. Dependiendo del contenedor (no conozco un ejemplo para php, estoy familiarizado solo con .net DI Containers) es posible que deba registrar también los tipos de objetos que se pueden crear en .

Inversión de Control significa que en lugar de una clase mayor nivel en función de una clase de nivel inferior aplicación (dependencia), el control se invierte de modo que la implementación de la clase de nivel inferior depende de una abstracción requerido por la clase de nivel superior.

//abstraction defined for the use of higher level class 
public interface IRepository {} 

// that's the dependency, the lower level class 
public class XmlRepository implements IRepository {} 

//the higher level class 
public class MyClass 
{ 
    public function __construct(IRepository $repo) {} 
    } 

IoC y DiC van de la mano ya que DI Container ofrece la función IoC.

+0

Buena explicación. Entonces, ¿hablamos de inyectar un objeto y almacenarlo dentro de la clase que lo ha inyectado, para permitir el acceso futuro? –

+0

Acerca de IoC, no entiendo tanto, si puede explicar más, le agradezco. –

+0

sobre DI, sí. Acerca de IoC, no sé cómo explicarlo mejor, sin embargo, cada vez que una clase especifica que necesita una abstracción como dependencia, ese es el patrón de IoC. – MikeSW

19

La ubicación del servicio y la inyección de dependencias son las primeras en desvincular las clases para que puedan ser probadas y modificadas fácilmente.

cuando se compara el registro y determinación partes de un IoC Container con un Servicio de Localización deque parece a ser el mismo.

Puede utilizar un contenedor IoC como un localizador de servicio, que se considera un patrón anti. Cuando utiliza la Ubicación del servicio, siempre debe llamar al Localizador de servicios activamente en toda su arquitectura. Así que desacopla sus clases, pero por otro lado las une todas al Localizador de servicios. Además, el descubrimiento de la dependencia es más difícil con un Localizador de servicios, porque está ocultando dependencias. Mientras que con Dependency Injection haces que las dependencias sean "públicas" mediante el uso de Constructor Injection.

Cuando utiliza un Contenedor de IoC, utiliza la Inyección de Dependencia (Inyección de Constructor o Inyección de Propiedades). El Contenedor de IoC ahora puede resolar el gráfico de dependencia mirando los parámetros del constructor y creando todo el gráfico de dependencia. Esto se llama auto-cableado. Un localizador de servicios no puede autoconectar dependencias. Como ya mencioné, no está obligado a utilizar el cableado automático, puede usar fácilmente el contenedor IoC como un Localizador de servicios simplemente llamando al contenedor IoC en cada clase directamente, ¡PERO NO DEBERÍA!

Consulte también: https://stackoverflow.com/a/11319026/175399

enter image description here

+0

+1 para imágenes = P –

+0

No entiendo para nada sobre IoC. ¿Puedes publicar algunas muestras? –

+1

Muy buena respuesta. – Steven

Cuestiones relacionadas