Creo que la mayoría de los contenedores IoC le permiten conectar dependencias con el archivo de configuración XML. ¿Cuáles son los inconvenientes y ventajas para usar el archivo de configuración frente a registrar dependencias en el código?¿Qué forma preferida de cablear dependencias usando el contenedor IoC?
Respuesta
Estos pros y contras se basan en mi trabajo con la primavera. Puede ser ligeramente diferente para otros contenedores.
XML
pro
- flexibles
- más potente que las anotaciones en algunas áreas
- modelado muy explícita de las dependencias de sus clases
con
- detallados
- dificultades con la refactorización
- cambiar entre varios archivos
Anotaciones
pro
- menos archivo de conmutación
- configuración automática para el tendido eléctrico simples
- menos detallado que el xml
con
- más de despliegue de datos específicos en su código (por lo general puede anular este con configuraciones XML)
- XML es almopst (?) Siempre se necesita, al menos, para establecer la configuración basada annonation
- magia anotación puede dar lugar a confusión en la búsqueda de la clase que se utiliza como dependencia
Código
pro
- puede tomar ventaja de las lenguas de tipo fuerte (por ejemplo, C#, Java)
- Algunos de control (no se puede comprobar las dependencias de forma estática, aunque el tiempo de compilación)
- puede tomar ventaja de DSL (por ejemplo Binsor, interfaces fluidas)
- menos detallado de XML (por ejemplo, no lo hace siempre que tenga que especificar el conjunto de montaje nombre calificado (.net cuando se habla))
con
- cableado a través de código puede dar lugar a complejos cableados
- dependencias duras al contenedor IOC en la base de código
Estoy usando una combinación de XML + Annotation. Algunas cosas especialmente relacionadas con el acceso a la base de datos siempre se configuran a través de xml, mientras que cosas como los controladores o servicios se configuran principalmente a través de anotaciones en el código.
[EDIT: He prestado Mauschs OPI code]
Supongo que al "registrar dependencias en el código" quiere decir "usar nuevo".
'nuevo' es un marco de inyección de dependencia extraordinariamente potente. Le permite "inyectar" sus "dependencias" en el momento de la creación del objeto, es decir, sin parámetros olvidados u objetos a medio construir.
El otro beneficio potencial importante es que cuando se utiliza herramientas de refactorización (digamos en ReSharper o IntelliJ), las llamadas a nuevo cambio demasiado
contrario, puede utilizar un cierto absurdo XML y refactorizar con XSL.
prossí - ¡lo que sea! amantes de la primavera. – time4tea
Infórmese antes de responder. La mayoría de los contenedores ofrecen formas alternativas de configuración que no sean xml. Las API fluidas pueden devolverte parte de la comodidad de refactorización. Además, los contenedores son más que solo una conveniencia DI: http://ayende.com/Blog/archive/2007/10/20/Dependency-Injection-doesnt-cut-it-anymore.aspx –
Me considero bastante bien informado sobre este tema en particular, ¡gracias por el consejo! Leí el artículo vinculado y aún no veo nada de interés en el 'marco'. Para ser honesto, todo en ese artículo me parece pobre. Sin embargo, cada uno para los suyos. Puedes llevar un caballo ... – time4tea
XML:
- puede cambiar el cableado y los parámetros sin tener que recompilar. A veces esto es bueno tener al cambiar los entornos (por ejemplo, puede cambiar un remitente falso correo electrónico utilizado en dev al remitente de correo electrónico real en la producción)
pros Código:
- pueden aprovechar lenguajes de tipo fuerte (por ejemplo, C#, Java)
- Algunos de control (no se puede comprobar las dependencias de forma estática, sin embargo) tiempo de compilación
- refactorable usando herramientas de refactorización regulares.
- puede tomar ventaja de DSL (por ejemplo Binsor, interfaces fluidas)
- menos detallado de XML (por ejemplo, no es necesario especificar siempre el nombre completo conjunto de montaje (cuando se habla .net))
estoy de acuerdo. He encontrado contenedores ioc que me dan muy poco, sin embargo, muy fácilmente pueden dificultar hacer algo. Puedo resolver la mayoría de los problemas que enfrento simplemente usando mi lenguaje de programación preferido, que siempre resultó ser más fácil de mantener y de navegar.
¿realmente responde la pregunta? – hoaz
- 1. Contenedor IoC Project-Embedded
- 2. Opciones para cablear dependencias con NInject
- 3. IoC, ¿dónde colocas el contenedor?
- 4. ¿Debo encapsular mi contenedor IoC?
- 5. ¿Puede Windsor cooperar con otro contenedor IoC?
- 6. Eliminar dependencia en el Contenedor de IoC
- 7. Tratando con dependencias circulares en IOC
- 8. Combinación del contenedor MEF y IoC
- 9. Cuándo usar un contenedor de IOC?
- 10. ¿Qué debería construirse a través de un contenedor de IOC?
- 11. ¿Se pueden inyectar dependencias en un constructor de una WebViewPage personalizada utilizando un contenedor IOC?
- 12. IoC: cableando dependencias en controladores de eventos
- 13. Cómo evitar el acoplamiento con un contenedor de IoC
- 14. Especifique el constructor para el contenedor Unity IoC para usar
- 15. Reemplazo de Spring.Net IoC con otro contenedor (por ejemplo, Ninject)
- 16. Contenedor IoC para bibliotecas de clases portátiles
- 17. ¿Por qué exactamente no es MEF un contenedor DI/IoC?
- 18. Constructor por defecto versus contenedor IOC
- 19. ¿Un contenedor de IoC reemplaza el uso de las fábricas
- 20. ¿Es una mala práctica o un olor codificado utilizar un contenedor IoC al instalar dependencias?
- 21. El mejor contenedor IOC para dispositivos Android/móviles
- 22. Contenedor IoC: ¿singleton o instancia pasada?
- 23. Usar el contenedor IoC para la arquitectura de complementos
- 24. Ligera contenedor IoC que trabaja en Unity3D
- 25. Contenedor IoC/DI compatible con Compact Framework
- 26. ¿Cómo se manejan las dependencias 'profundas' con IoC y DI?
- 27. Usando nombres para discriminar instancias usando IoC
- 28. Forma preferida de crear enlaces con backbone.js
- 29. forma preferida de ajuste/matrices que regresan
- 30. Usando MEF como IoC
parece que te faltan registros de código y me faltan registros de anotaciones. –