He decidido usar los principios de IoC en un proyecto más grande. Sin embargo, me gustaría aclarar algo que me ha estado molestando por mucho tiempo. La conclusión a la que me he llegado es que un contenedor de IoC es un patrón arquitectónico, no un patrón de diseño. En otras palabras, ninguna clase debe conocer su presencia y el contenedor en sí debe usarse en la capa de aplicación para unir todos los componentes. Esencialmente, se convierte en una opción, además de un modelo bien diseñado orientado a objetos. Habiendo dicho eso, ¿cómo es posible acceder a tipos resueltos sin rociar contenedores IoC por todos lados (independientemente de si son abstraídos o no)? La única opción que veo aquí es utilizar fábricas abstractas que usan un contenedor IoC para resolver tipos concretos. Esto debería ser lo suficientemente fácil como para cambiar para un conjunto de fábricas estándar. ¿Es este un buen enfoque? ¿Alguien aquí lo usó y qué tan bien funcionó para usted? ¿Hay algo más disponible?¿Patrón de fábrica abstracto sobre IoC?
Gracias!
Creo que ya casi estoy allí. Quédate aquí conmigo :) Digamos que tengo la interfaz IFruit que implementa la clase Apple. Después de registrar este tipo concreto, quiero usarlo en mi evento de clic de botón en Windows Form. ¿Cómo llegaría a la clase de Apple sin acceder explícitamente al contenedor IoC desde el evento button? –
Eso depende: ¿hay muchas instancias de IFruit en su aplicación, o solo una? Si solo hay uno, ya debería haberse inyectado en la clase con el controlador de clic de botón. Si hay muchos, lo más probable es que necesite una IFruitFactory que pueda crear una instancia de IFruit a partir de otros valores de tiempo de ejecución. En este último caso, IFruitFactory sería la dependencia inyectada. –
Considerando que solo existe una instancia de IFruit, la única forma en que lo veo inyectado en la clase Form con el evento click del botón es si cambio el constructor del formulario para incluir la interfaz IFruit y luego registro el Formulario mismo con el contenedor IoC para realizar el constructor inyección. ¿Esto suena correcto? Gracias por ayudar! –