En términos simples y/o en pseudocódigo de alto nivel, ¿cómo funciona un contenedor DI y cómo se usa?¿Explicación más simple de cómo funciona un contenedor DI?
Respuesta
En su núcleo, un contenedor DI crea objetos basados en mappings entre interfaces y tipos concretos.
Esto le permitirá solicitar un tipo abstracto del contenedor:
IFoo f = container.Resolve<IFoo>();
Esto requiere que haya previamente configurado el contenedor al mapa de IFoo a una clase concreta que implemente IFoo (por ejemplo Foo)
Esto en sí mismo no sería particularmente impresionante, pero DI Contenedores hacer más:
- Ellos usan Auto-cableado que significa que se pueden calcular automáticamente que si IFoo asigna a Foo y mapas Ibar Bar, pero Foo tiene una dependencia en IBar, creará una instancia de Foo con una barra cuando solicite IFoo.
- Gestionan el de por vida de componentes. Muchos quieren una nueva instancia de Foo todo el tiempo, pero en otros casos es posible que desee la misma instancia. Incluso puede desear nuevas instancias de Foo cada vez, pero la Barra inyectada debería seguir siendo la misma instancia.
Una vez que comience a tratar de administrar manualmente composición y vidas usted debe comenzar a apreciar los servicios prestados por un DI de contenedores :)
Muchos DI contenedores pueden hacer mucho más que el anterior, pero aquellos son los servicios centrales. La mayoría de los contenedores ofrecen opciones para configuring via either code or XML.
Cuando se trata de uso correcto de contenedores, Krzysztof Kozmic acaba de publicar a good overview.
Configura un contenedor DI para que conozca sus interfaces y tipos: cómo cada interfaz se correlaciona con un tipo.
Cuando llama al Resolve
en él, mira la asignación y devuelve el objeto mapeado que ha solicitado.
Algunos contenedores DI usan convenciones sobre la configuración, donde, por ejemplo, si define una interfaz ISomething
, buscará un tipo concreto Something
para instanciar y devolver.
"no es nada más que una suposición tabla hash de objetos."
Aunque lo anterior es una subestimación masiva que es la manera más fácil de pensar en ellos. Dada la recopilación, si solicita la misma instancia de una clase, el contenedor DI decidirá entre darle una versión almacenada en caché o una nueva, y así sucesivamente.
Su uso lo hace más fácil y más limpio cuando se trata de cablear dependencias. Imagina que tienes las siguientes pseudo clases.
class House(Kitchen, Bedroom)
// Use kitchen and bedroom.
end
class Kitchen()
// Code...
end
class Bedroom()
// Code...
end
La construcción de una casa es un dolor sin un contenedor de DI, se tendría que crear una instancia de un dormitorio, seguido por una instancia de una cocina. Si esos objetos también tuvieran dependencias, necesitarías cablearlos. A su vez, puede gastar muchas líneas de código solo conectando objetos. Solo entonces podrías crear una casa válida. Usando un contenedor DI/IOC (Inversión de control) dices que quieres un objeto doméstico, el contenedor DI creará recursivamente cada una de sus dependencias y te devolverá una casa.
Sin DI/COI envase:
house = new House(new Kitchen(), new Bedroom());
Con DI/COI envase:
house = // some method of getting the house
Al final del día que hacer el código fácil de seguir, fácil de escribir y cambiar la responsabilidad de cablear objetos juntos lejos del problema en cuestión.
Debe tenerse en cuenta que DI es bueno porque evita que tenga que escribir sus propios constructores complejos y su propio código para configurar cosas y un montón de cosas así. Mientras que sí, no * lo * necesita, es bueno poder aprovechar una biblioteca existente para manejar todo eso por usted. Hace que la configuración de las aplicaciones Java (C# no es mi área de especialización) se parezca un poco a trabajar con un lenguaje de scripts pobre, inconsistente y excesivamente complejo ... –
- 1. ¿Cómo elegir un contenedor DI?
- 2. Acceso al contenedor DI
- 3. Contenedor CUDA más simple para principiantes
- 4. qué contenedor DI va a satisfacer esta
- 5. Contenedor IoC/DI compatible con Compact Framework
- 6. ¿Alguien puede dar una explicación simple de alto nivel a un principiante sobre cómo funciona Hadoop?
- 7. ¿Por qué exactamente no es MEF un contenedor DI/IoC?
- 8. Función simple de quantmod no funciona más
- 9. ¿Contenedor DI, de fábrica o nuevo para objetos efímeros?
- 10. contenedor jdbc simple
- 11. Un singleton más simple
- 12. Haskell - ¿Currying? Necesita más explicación
- 13. ¿Una explicación simple de Rings en Riak?
- 14. ¿Dónde debo almacenar una referencia a mi contenedor DI?
- 15. ¿Cómo usar un contenedor DI/IoC con el archivador modelo en ASP.NET MVC 2+?
- 16. Explicación básica simple de una tabla hash distribuida (DHT)
- 17. Creando un contenedor simple de C++. Net. Paso a paso
- 18. Comprender la necesidad de un marco DI
- 19. ¿Qué hay de malo con el uso de ThreadStatic en lugar de un contenedor DI?
- 20. ¿Cómo funciona este simple FxAA?
- 21. UINavigationController: ejemplo más simple
- 22. Necesita una explicación simple del método de inyección
- 23. Explicación muy simple de una expresión de Lambda
- 24. Cómo hacer Hollywood Principio + DI + WPF + Unidad
- 25. Mantener el uso del contenedor DI en la raíz de composición en Silverlight y MVVM
- 26. ¿Entiendo correctamente DI/IoC?
- 27. ¿Hay un contenedor de instancias alrededor de una clase estática con el propósito de DI y anti patrón?
- 28. más simple TBB ejemplo
- 29. ¿Cómo ejecuto un contenedor desde el interior de un contenedor?
- 30. Setter DI vs. Constructor DI en Spring?
Corto y dulce y libre de tóxicos Analogías del coche! – Shog9