¿Cómo administra la configuración con la inyección de dependencias?

15

Soy un gran fan de DI / IOC. Es excelente para manejar / abstraer dependencias difíciles y hace la vida un poco más fácil.

Sin embargo, tengo una pequeña queja con él, que no estoy seguro de cómo resolverlo.

La idea básica en DI / IOC es que cuando se crea una instancia de un objeto, todas sus dependencias se llenan previamente dentro del constructor.

Sin embargo, en mi humilde opinión, existen varios tipos de parámetros para los constructores (especialmente cuando sus objetos son inmutables).

  1. Dependencias (los objetos requeridos para que su objeto funcione)
  2. Configuración (información sobre el entorno requerido para trabajar)
  3. Parámetros (Datos sobre los que se trabaja)

Encuentro que IOC funciona bien con dependencias. Pero todavía estoy tratando de encontrar la mejor manera de lidiar con los otros dos. Sin embargo, dado que el constructor está destinado a ser ejecutado por el contenedor IOC, parece que necesito colocar estos elementos en el contenedor IOC.

Me gustaría saber qué estrategias / patrones emplean las personas y qué ventajas y desventajas han encontrado.

NB. Soy consciente de que esta es una pregunta altamente subjetiva, y he tratado de convertirla en una "buena" pregunta subjetiva según las directrices de SE.

    
pregunta ArTs 10.02.2014 - 11:36
fuente

2 respuestas

9
  

Configuración (información sobre el entorno requerido para hacer el trabajo)

Cree una clase de configuración (para ser exigente: una interfaz + una implementación) cuyo propósito es proporcionar información sobre el entorno. Esto hace que la configuración no sea diferente de otros objetos requeridos para que su objeto funcione (punto 1).

  

Parámetros (Datos sobre los que se trabaja)

En un entorno orientado a objetos, los tipos de datos primitivos se pueden encapsular en objetos, por lo que esto también conduce al punto 1. Pero probablemente encontrará esta pregunta SO interesante, trata exactamente la situación de los parámetros primitivos en un constructor, cuando se usa un contenedor DI . En el ejemplo dado, el diseño podría mejorarse, lo que evitó la necesidad de tipos primitivos en el constructor por completo.

    
respondido por el Doc Brown 10.02.2014 - 13:33
fuente
1

Lo que hago es un patrón de fábrica para estos casos.

No uso el objeto en sí como una dependencia, sino que creo un objeto de fábrica con un método Get que acepta parámetros que no pueden ser vinculados automáticamente por el contenedor.

Ej .:

 interface IDependencyObject {
       ....
 }

 class DependencyObject {

      public DependencyObject(int primitive, IAnotherDependency anotherDependency) {
      ...
      }

 }

 class DependencyObjectFactory {

      private readonly IAnotherDependency anotherDependency;

      public DependencyObjectFactory(IAnotherDependency anotherDependency) {
           this.anotherDependency = anotherDependency;
      }

      public IDependencyObject Get(int primitive) {
           return new DependencyObject(primitive, anotherDependency);
      }
 }

 interface IDependencyObjectFactory {
       IDependencyObject Get(int primitive);
 }
    
respondido por el Vilém Procházka 14.02.2014 - 20:04
fuente

Lea otras preguntas en las etiquetas