8

Después de escuchar el Clean Code Talks, llegué a entender que deberíamos usar fábricas para componer objetos. Así, por ejemplo, si un House tiene un Door y una Door tiene un DoorKnob, en HouseFactory creamos un nuevo DoorKnob y la pasamos al constructor de Door, y luego pasar esa nueva Door objeto al constructor de House.Inyección de constructor: ¿también inyectamos fábricas?

Pero ¿qué pasa con la clase que utiliza el House(por ejemplo el nombre de la clase es ABC)? Dependerá de HouseFactory, ¿verdad? Entonces, ¿pasamos el HouseFactory en el constructor de ABC? ¿No tendremos que pasar un montón de fábricas en el constructor de esa manera?

Respuesta

9

Siguiendo con el ejemplo de la puerta y pomo de la puerta, no se inyecta una fábrica - se inyecta el propio DooKnob:

public class Door 
{ 
    private readonly DoorKnob doorKnob; 

    public Door(DoorKnob doorKnob) 
    { 
     if (doorKnob == null) 
      throw new ArgumentNullException("doorKnob"); 

     this.doorKnob = doorKnob; 
    } 
} 

No hay fábricas están a la vista en este nivel.

Casa, por el contrario, depende de la puerta, pero no en el tirador:

public class House 
{ 
    private readonly Door door; 

    public House(Door door) 
    { 
     if (door == null) 
      throw new ArgumentNullException("door"); 

     this.door = door; 
    } 
} 

Esto mantiene las opciones abiertas hasta que por fin se tiene para componer todo en la aplicación Composition Root:

var house = new House(new Door(new DoorKnob())); 

Puede usar un Contenedor DI para componer a este nivel, pero no es necesario. No hay fábricas involucradas.

+0

gracias por la respuesta. una pregunta sobre la raíz de la composición. ¿Cuál debería ser la raíz de composición cuando se trata de una llamada EJB o un servicio web? ¿Es el método llamado en sí? –

+0

Esas son características específicas de Java con las que no estoy familiarizado, pero como composición conceptual general ocurre muy tarde: cuando ya no puede posponerlo más. –

1

Si inyecta demasiadas fábricas que es un olor a código llamado constructor over-injection que indica que su clase está haciendo demasiado.

Muchos contenedores ofrecen una función llamada fábricas de automóviles. Eso significa que generan fábricas de tipo Func<T> automáticamente si saben cómo generar T.

Castle Windsor tiene una función avanzada llamada Typed Factory facilities que genera implementaciones de una interfaz de fábrica sobre la marcha.

También hay un puerto de fábricas tipadas para Unity en el TecX project.

0

Si termina usando Unity, recientemente he implementado un equivalente de Castle Windsor Typed Factories para Unity. Puede encontrar el proyecto en https://github.com/PombeirP/Unity.TypedFactories, y el paquete NuGet en http://nuget.org/packages/Unity.TypedFactories.

el uso es el siguiente:

unityContainer 
    .RegisterTypedFactory<IFooFactory>() 
    .ForConcreteType<Foo>(); 

Sólo tienes que crear la interfaz IFooFactory con un método de regresar IFoo, y el resto está hecho para usted por la biblioteca. Puede resolver IFooFactory y usarlo para crear IFoo objetos de inmediato.

Cuestiones relacionadas