2012-03-15 7 views
6

¿Cuál es la forma correcta de hacer lo siguiente para que ParentClass no dependa de MyClass?Inyección de dependencia en un bucle

public class ParentClass 
{ 
    public void MyFunction(IList<Foo> foos) 
    { 
     foreach (var bar in foos) 
     { 
      var myClass = new MyClass(); 
      myClass.DoStuff(); 
     } 
    } 
} 

normalmente sin un bucle que acababa de inyectarlo en ParentClass con el constructor, pero aquí necesito una nueva instancia de la misma para cada iteración del bucle.

¿O tal vez hay una manera mejor de hacer lo que estoy tratando de lograr? Tal vez myClass podría restablecerse al final de cada iteración para que pueda reutilizarlo?

+0

Entonces, ¿por qué no definir una colección de objetos, o simplemente definir DoStuff como estático al crear una nueva instancia y descartarlos inmediatamente –

Respuesta

7

Puede inyectar un objeto de fábrica que crea instancias de MyClass en ParentClass.

Para cada iteración de bucle, llama al objeto de fábrica para que le proporcione una nueva instancia de MyClass.

+1

¿Cómo se crea un objeto dentro de la fábrica cuando el objeto tiene más dependencia? En este caso, tenemos que inyectar el contenedor a la fábrica. Veo dos advertencias aquí: inyectar el contenedor y usar el contenedor. Resolver (localizador de servicio). ¿Esto es recomendado? Cualquier otro enfoque? – hungryMind

+0

Esta es una buena pregunta, @hungryMind, creo que debería promocionarla como una pregunta real en SO y vincularla a esta. De todos modos, encontré este artículo que proporciona algunas opciones: http://blog.ploeh.dk/2012/03/15/ImplementinganAbstractFactory/ – Fabio

1

Puede insertar un Func<IMyClass> en el constructor, luego llamarlo tantas veces como desee para obtener instancias diferentes.

frameworks de IoC como Autofac soportan esto de forma nativa.

+0

Estoy de acuerdo con usted. Sin embargo, le sugiero que no use ningún contenedor IoC hasta que sea necesario: DTSTTCPW (el más simple piensa que puede funcionar) – Skyp

+0

@Skyp 'Simple' es un concepto vago sin objetivos o metas. Si la prueba unitaria es un objetivo, entonces usar IoC es una de las cosas más simples que podrían funcionar. –

0

Realmente depende de lo que quieras hacer con MyClass. Tal como está, no existe una correlación entre foo's, bar's y MyClass. Asumiendo que usted inyectaría una barra en el Ctor de MyClass, o la pasaría como un parámetro a DoStuff, entonces simplemente inyectaría una clase o método de fábrica en el Ctor de ParentClass y lo usaría en lugar de actualizar MyClass.

0

Su inyección propuesta es legible, comprensible y fácil de verificar para la corrección.

Restablecer el objeto es una opción si el bucle es grande o si MyClass es costoso de crear (por ejemplo, abre una conexión, maneja un archivo, subprocesa o inicia un hilo).

Dado que la solución reset() requiere más tiempo y concentración para verificar cada cambio de código, recomiendo medir que se trata de un cuello de botella antes de molestar.

Cuestiones relacionadas