Estoy tratando de averiguar cuándo usar el registro DIC / IoC para configurar mi software y cuándo usar fábricas, junto con el razonamiento detrás de cada enfoque.
Estoy usando StructureMap como mi contenedor DI (DIC), que es fácil de configurar mediante registros. En el DIC, prácticamente todos los objetos registrados son estáticos en el sentido de que no necesito cambiar / intercambiar ninguna implementación / instancia en tiempo de ejecución, una vez que el DIC se configura y se configura en el DIC como singletons. Sin embargo, dado que mi software (SW) se ejecutará en diferentes dispositivos , necesito seleccionar un registro específico del dispositivo dependiendo del dispositivo en el que se ejecute mi SW para configurar el hardware en consecuencia.
Dado que la construcción de algunos de mis objetos requiere lectura en los archivos de configuración, estoy usando fábricas para devolver estas instancias al DIC, con el fin de separar la lectura de la configuración de la creación del objeto. Registré los captadores de fábrica en el DIC para los tipos de complementos correspondientes.
Ahora digamos que tengo un tipo de complemento IMotor
con tipos concretos Motor1
y Motor2
, que debería manejar una fábrica. Ahora hay dos formas en que puedo decidir cómo configurar mi dispositivo:
- Paso información sobre el dispositivo en el que se ejecuta el SW
MotorFactory
y devuelve el motor correcto, ya seaMotor1
oMotor2
. En este caso, la lógica para decidir está dentro de la Fábrica. - Configuro el DIC de acuerdo con el dispositivo en el que se está ejecutando y creo dos fábricas
Motor1Factory
yMotor2Factory
, donde una creaMotor1
y la otraMotor2
. En este caso, tendría entradas de registro diferentes paraIMotor
los registros específicos del dispositivo que usanMotor1Factory
oMotor2Factory
.
Ahora mi pregunta es: ¿Cuál de estos dos métodos es preferible y por qué? Para mí, parece que el primer caso no es sencillo y complicado, ya que estoy extendiendo la lógica que decide qué tipo de instancia en toda la base de código. Mientras que en el segundo caso, estoy multiplicando efectivamente el número de fábricas en mi código, ya que necesitaré una fábrica para (casi) cada tipo de concreto. Se vuelve aún más confuso para mí, cuando se agregan fábricas abstractas a la mezcla.
Así que de nuevo: ¿Cuándo debo usar un método u otro? Y lo más importante: ¿Cuáles son buenos indicadores para decidir qué camino tomar?