5

Estoy interesado en aplicar la inyección de dependencia a mi proyecto actual, que hace uso del patrón MVC.¿Cómo evitar inyectar dependencias en un objeto para que pueda pasarlas?

Mis controladores llamarán a los modelos y, por lo tanto, deberán inyectar las dependencias en los modelos. Para hacer esto, el controlador debe tener las dependencias (como un objeto de base de datos) en primer lugar. El controlador no necesita hacer uso de algunas de estas dependencias (como el objeto de la base de datos), por lo que creo que no se debe dar esta dependencia. Sin embargo, tiene que tener estas dependencias para inyectarlas en los objetos modelo.

¿Cómo puedo evitar tener dependencias inyectadas en un objeto solo para que pueda pasarlas? Si lo hace, se siente mal y puede provocar que muchas dependencias se inyecten en un objeto.

Editar: Estoy usando PHP.

Respuesta

2

Estoy de acuerdo con sus inquietudes. Es un olor a código tomar dependencias con el único propósito de pasarlas a otras dependencias.

En función de la interacción exacta entre esas dependencias, que tienen un par de opciones:

Si se necesita sólo una instancia de la dependencia

Si el controlador sólo necesita una única instancia de una dependencia , entonces simplemente toma una dependencia de eso en su lugar.

(disculpas por el código C#)

No hacen esto:

public class MyController 
{ 
    public MyController(IDb db) 
    { 
     var dep = new MyDependency(db); 
     // Use dep or save it for later 
    } 
} 

En su lugar, usted puede hacer esto:

public class MyController 
{ 
    public MyController(MyDependency dep) 
    { 
     // Use dep or save it for later 
    } 
} 

es posible que desee considerar MyDependency detrás de una interfaz en sí misma. Vea también Refactoring to Aggregate Services.

Si necesita crear varias instancias durante la vida del controlador

A veces, sin embargo, es necesario crear varias instancias dinámicamente. Este suele ser el caso cuando necesita un valor que solo está disponible en el tiempo de ejecución antes de que pueda llenar por completo una dependencia.

En este caso, un Abstract Factory es un excellent and universal solution.

+0

No entiendo completamente lo que usted propone que haga con su primera opción. ¿Está agrupando las dependencias y pasándolas como una sola? –

+0

Esa es una opción. El punto principal, sin embargo, es que el consumidor no debe crear la dependencia en absoluto, sino más bien solicitarla requiriéndola como un parámetro de constructor. –

+0

¿No agrupa las dependencias y las pasa al controlador, prácticamente lo mismo que pasarlas todas individualmente? Es una forma diferente de hacerlo, pero aún está pasando dependencias al controlador que no utiliza. ¡Aunque creo que no entendí lo que querías decir! –

1

No hablo desde la experiencia de PHP, pero debe consultar Inversion of Control (IOC) Containers.

Este question en StackOverflow habla sobre los Contenedores de IOC para PHP. Para obtener una descripción general rápida de algunos de los other benefits of IOC Containers, debe consultar esta pregunta, probablemente una de mis favoritas en el sitio. Compruebe la última respuesta;)

¿Cómo puedo evitar tener dependencias inyectadas en un objeto sólo para que puede pasarlos? Si lo hace, se produce un error de y puede provocar que muchas dependencias se inyecten en un objeto .

La mayoría de las personas no se dan cuenta de que un contenedor de IOC hace que la necesidad de almacenar dependencias temporales sea nula. Esto a su vez hace que su código sea más limpio y más fácil de seguir. Cada clase (o módulo) de tu código simplemente pregunta qué necesita. Los Contenedores IOC pueden administrar el tiempo de vida del objeto, por lo que incluso si dos clases piden la misma dependencia de forma independiente, pueden recibir la misma instancia, que es bastante clara.

Cuestiones relacionadas