Inyección de dependencias
En lugar de instanciar las partes por sí mismo, un coche pide las partes que necesita para funcionar.
class Car
{
private Engine engine;
private SteeringWheel wheel;
private Tires tires;
public Car(Engine engine, SteeringWheel wheel, Tires tires)
{
this.engine = engine;
this.wheel = wheel;
this.tires = tires;
}
}
Factoría
Une las piezas para hacer un objeto completo y oculta el tipo concreto al llamador.
static class CarFactory
{
public ICar BuildCar()
{
Engine engine = new Engine();
SteeringWheel steeringWheel = new SteeringWheel();
Tires tires = new Tires();
ICar car = new RaceCar(engine, steeringWheel, tires);
return car;
}
}
Resultado
Como puedes ver, las factorías y la inyección de dependencias se complementan entre sí.
static void Main()
{
ICar car = CarFactory.BuildCar();
// usa el coche
}
¿Recuerdas a Ricitos de Oro y los tres osos? Bueno, la inyección de dependencias es algo así. Aquí hay tres formas de hacer lo mismo.
void RaceCar() // ejemplo #1
{
ICar car = CarFactory.BuildCar();
car.Race();
}
void RaceCar(ICarFactory carFactory) // ejemplo #2
{
ICar car = carFactory.BuildCar();
car.Race();
}
void RaceCar(ICar car) // ejemplo #3
{
car.Race();
}
Ejemplo #1 - Este es el peor porque oculta completamente la dependencia. Si miraras el método como una caja negra no tendrías idea de que requería un coche.
Ejemplo #2 - Esto es un poco mejor porque ahora sabemos que necesitamos un coche ya que pasamos una factoría de coches. Pero esta vez estamos pasando demasiado ya que todo lo que realmente necesita el método es un coche. Estamos pasando una factoría solo para construir el coche cuando el coche podría ser construido fuera del método y pasado.
Ejemplo #3 - Esto es ideal porque el método pide exactamente lo que necesita. Ni más ni menos. No tengo que escribir un MockCarFactory solo para crear MockCars, puedo pasar el mock directamente. Es directo y la interfaz no miente.
Esta charla técnica de Google por Misko Hevery es increíble y es la base de la que derivé mi ejemplo. http://www.youtube.com/watch?v=XcT4yYu_TTs