patrones patron inyeccion ejemplo diseño dependencias control objective-c cocoa dependency-injection

objective c - patron - ¿Marco de inyección de dependencia para el cacao?



patron de inyeccion (12)

Interface Builder se puede utilizar para la inyección de dependencia básica en una aplicación Cocoa, pero ¿alguien sabe de frameworks de inyección de dependencia más completos para Objective-C / Cocoa para cuando no desea instanciar objetos en un archivo NIB?

Editar

Para aclarar, reconozco que IB se puede usar para DI básica, pero estoy buscando un marco con funcionalidad más completa, que incluya configuraciones de prueba y producción separadas, en la misma línea que Groovy o Springs.


¿Alguno de ellos ha analizado la función Referencias asociativas de Mac OS X 10.6?

Creo que con esto sería posible construir o ya tener algo similar a DI. Sin embargo, por lo que he visto, cualquier referencia que se necesite en un objeto debe buscarse manualmente usando objc_getAssociatedObject ().

Manfred



¿Qué pasa con la implementación de la inyección de dependencia en Objective-IOC


Creo que encontrará que no lo necesita en lenguajes de enlace tardío como Objective C, Ruby, Lisp, etc. Al igual que la revelación de Jamis de que iba por un camino demasiado complejo cuando intentó construir una aguja, revisó un marco DI para Ruby- Net :: SSH .

Aquí hay algunos enlaces que con suerte le darán un código de muestra para hacer cosas similares en el Objetivo C. Con las categorías, puede esencialmente cambiar el comportamiento de cualquier clase en tiempo de ejecución. Consulte las Sugerencias para desarrolladores de Mac: Objective-C: Categorías y los documentos Cocoa API en categorías . Esencialmente no necesitas un lugar central para pedir "lo que hace x" que sea configurable, porque puedes instanciar TheThingThatDoesX directamente y si hay algo más que necesita cambiar / enganchar en ese comportamiento, puede usar categorías.


DI es una propiedad de un entorno de ejecución que requiere un enlace dinámico. Soy muy nuevo en Obj-C y Cocoa, así que puedo hablar fuera de turno. A menos que me esté perdiendo algo, no veo cómo se podría implementar DI salvo interpretando Obj C en lugar de compilarlo, o modificando el entorno de tiempo de ejecución.

Sospecho que el comportamiento similar al DI de IB se debe a que hay un entorno de tiempo de ejecución específico del dominio asociado con las aplicaciones que se crean con él.

Estoy feliz de ser corregido sin embargo.

Las categorías parecen ser una implementación de mixin, que permite el envío dinámico de métodos a un delegado. Bastante fresco y similar al concepto de interfaz de Java, pensé que los detalles diferían y, a partir de lo siguiente, no puedo ver si las constantes se pueden definir en una categoría, aunque los campos de miembros no pueden.

Categorías objetivo-c


He escrito un contenedor DI muy simple, el código está en GitHub . Solo puede hacer lo básico básico, es decir. descubrir las dependencias de un objeto y satisfacerlas utilizando otros objetos dados. Descubrí que para ser utilizable en aplicaciones del mundo real, el código es muy simple y es divertido piratearlo.


Interface Builder no hace NINGUNA inyección de dependencia. No es necesario. Interface Builder serializa objetos. Cuando un plumín es "despertado" (también conocido como abierto), no hay "dependencias" que resolver, solo hay propiedades para establecer. Muy, muy simple. La apertura de una punta se basa únicamente en el protocolo NSCoding y la codificación de clave-valor.

La inyección de dependencia, casi un proyecto de trabajo en el mejor de los casos, o en el mejor de los casos una capa de pegamento generalizada entre componentes diseñados de manera independiente, no sirve para el código Objective-C bien escrito. Usted está pidiendo una herramienta que no necesita.

En Objective-C, el software que requiere un servicio anónimo declara un protocolo. Los servicios luego adoptan este protocolo. Los clientes cargan servicios como complementos dinámicos. Por otro lado, si el servidor se escribió antes que el cliente, simplemente se trata de escribir un nuevo complemento que adapte la interfaz existente al protocolo. Esto es menos trabajo y más sencillo que tratar de definir un sistema intermedio basado en datos para "descubrir" (por favor) una interfaz en tiempo de ejecución.

¿No es obvio para todos que el gran secreto de DI es solo que es una forma de escribir código en XML en lugar de hacerlo en el idioma nativo? Realmente me gustaría escuchar un buen argumento sobre cómo XML es de alguna manera un mejor lenguaje de programación que un lenguaje de programación real. No tiene ningún sentido.


No tiene que crear una instancia del objeto en el archivo NIB. Si configura el Propietario del archivo para la clase de su objeto y luego vincula cosas en la vista / ventana / lo que sea hasta eso, puede configurar su objeto como propietario en tiempo de ejecución cargando el archivo nib manualmente. De esta forma, puede tener una instancia dinámica de un objeto que aún reciba dependencias inyectadas correctamente.


Saldré de una extremidad y hablaré sobre esto. La inyección de dependencia como se describe en la respuesta principal no aborda el problema central que están teniendo aquellos que buscan usarlo. Quisiéramos un medio de desarrollo donde el componente A no crea directamente una instancia o referencia al componente B. El componente A está vinculado por el protocolo al componente B y no está referenciado en absoluto por el componente A. Esto permite que el componente B sea reemplazado en cualquier momento sin tocando el componente A. Yo voté pero investigaré tus referencias ya que parece que hay algunos que están de acuerdo contigo. No estoy tratando de debatir, solo estoy buscando aprender. Me gustaría saber más sobre el enfoque "no, no necesitas hacerlo".


Trabajo con Spring todo el día y he comprobado Groovy. No soy de ninguna manera un experto en XCode / Cocoa, pero IB solo hace algunas inyecciones de dependencia, lo que Groovy realmente ni siquiera dice que está haciendo.

Creo que no está buscando DI, sino más bien un conjunto bien compilado de bibliotecas integradas que le ahorra tipear una gran cantidad de código que otras personas también han tipeado. Creo que no hay marcos Spring para Cocoa porque, por alguna razón, las personas tienden a ver el "Código Abierto" como "no dependiente de la plataforma" y, por lo tanto, a Cocoa se lo deja un poco frío.

Sin embargo, dependiendo de sus necesidades, hay algunas buenas bibliotecas gratuitas de código abierto disponibles para Cocoa, todas incluidas en CocoaDev en una lista agradable .

Sé que no es primavera, pero espero que ayude.


objection por AtomicObject. Está moldeado a la imagen de Guice.


Tifón

Hace casi un año, lancé: https://github.com/typhoon-framework/Typhoon

El sitio web de Typhoon enumera las características principales. Un resumen rápido:

  • No invasivo No se requieren macros o XML. Utiliza un poderoso enfoque de tiempo de ejecución de Objective-C .

  • Facilita tener múltiples configuraciones de la misma clase base o protocolo.

  • Sin cadenas mágicas: admite la refactorización IDE, la finalización del código y la verificación en tiempo de compilación.

  • Admite la inyección de controladores de visualización y la integración del guión gráfico.

  • Admite la inyección de inicializador y propiedad, además de la administración del ciclo de vida.

  • Potentes funciones de administración de memoria. Proporciona objetos preconfigurados, sin la sobrecarga de memoria de los singletons.

  • Excelente soporte para dependencias circulares.

  • Apoyarse. Tiene una huella muy baja, por lo que es apropiado para dispositivos con limitaciones de CPU y memoria.

  • Probado en combate: se usa en todo tipo de aplicaciones destacadas en la tienda de aplicaciones.

  • Un equipo central distribuido internacionalmente (incluso monitoreamos ), por lo que el soporte para cualquiera de sus preguntas nunca está lejos :)

API Docs y aplicación de muestra

Control de calidad:

También mantenemos un sólido sistema de control de calidad.

  • Cada compromiso desencadena una serie de pruebas de regresión
  • Mantenemos una cobertura de prueba alta.