¿Marco de inyección de dependencia para el Cacao? [cerrado]


Interface Builder se puede usar para la inyección básica de dependencias en una aplicación Cocoa, pero ¿alguien conoce marcos de inyección de dependencias más completos para Objective-C/Cocoa para cuando no desea crear instancias de objetos en un archivo NIB?

Editar

Para aclarar, reconozco que el IB se puede usar para el DI básico, pero estoy buscando un marco con una funcionalidad más completa, que incluya configuraciones de producción y pruebas separadas, a lo largo de las líneas de Groovy o Termales.

Author: Barry Wark, 2008-11-21

12 answers

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 trató de construir needle, un framework DI para Ruby- Net::SSH revisited.

Aquí hay algunos enlaces que con suerte le darán un código de ejemplo para hacer cosas similares en Objective C. Con las categorías, esencialmente puede cambiar el comportamiento de cualquier clase en tiempo de ejecución. Ver Consejos para Desarrolladores de Mac – Objective-C: Categories and the Cocoa API docs on categories. Esencialmente no necesitas un lugar central para pedir" la cosa que hace x " que es configurable, porque puedes instanciar TheThingThatDoesX directamente y si algo más necesita cambiar / enganchar en ese comportamiento puede usar categorías.

 11
Author: Otto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-21 07:04:19

Objection by AtomicObject. Se moldea en la imagen de Guice.

 29
Author: justice,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-20 09:53:05

Me arriesgaré a hablar de esto. La inyección de dependencia como se describe en la respuesta superior no aborda el problema central que están teniendo aquellos que buscan usarla. Nos gustaría un medio de desarrollo donde el componente A no instancie directamente o haga 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 tocar el componente A. Voté por abajo, pero investigaré su referencias como parece que hay unos pocos que están de acuerdo con usted. No estoy tratando de debatir, sólo busco aprender. Me gustaría entender más sobre el enfoque de "no, no necesitas hacer eso".

 16
Author: Cliff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-28 18:14:05

Typhoon

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

El Typhoon-website enumera las características clave. Un breve resumen:

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

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

  • Sin cuerdas mágicas - soporta refactorización IDE, finalización de código y comprobación en tiempo de compilación.

  • Admite la inyección de controladores de vista y la integración de storyboard.

  • Admite tanto el inicializador como la inyección de propiedades, además de la administración del ciclo de vida.

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

  • Excelente soporte para dependencias circulares.

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

  • Probado en batalla-utilizado en todo tipo de Appstore-aplicaciones destacadas

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

Documentos de API y aplicación de ejemplo

Control de calidad:

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

 5
Author: Jasper Blues,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-22 21:56:53

No es necesario crear instancias del objeto en el archivo NIB. Si establece el Propietario del archivo a la clase de su objeto y luego enlaza cosas en la vista/ventana/lo que sea hasta eso, puede establecer su objeto como propietario en tiempo de ejecución cargando el archivo nib manualmente. De esta manera, puede tener una instancia dinámica de un objeto que aún recibe dependencias inyectadas correctamente.

 4
Author: Jason Coco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-21 19:30:26

¿Qué pasa con la implementación de la inyección de dependecy en Objetivo-COI

 3
Author: mivasi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-20 07:31:11

¿Qué pasa con ObjectivePim? ObjectivePim

 3
Author: Víctor B.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-15 13:44:15

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

 1
Author: zoul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-06 12:18:28

¿Alguien ha visto la característica Referencias asociativas de Mac OS X 10.6?

Creo que con esto sería posible construir o ya tener algo similar a DI. Por lo que he visto sin embargo, cualquier referencia que se necesita en un objeto tiene que ser obtenida manualmente usando objc_getAssociatedObject().

Manfred

 -1
Author: Manfred,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-19 09:00:35

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

Inyección de dependencia, más o menos un proyecto de hacer-trabajo en el mejor de los casos, o en el mejor de los casos una capa de pegamento generalizada entre los componentes diseñados de forma independiente, es de ninguna utilidad en el código Objective-C bien escrito. Estás pidiendo una herramienta que no necesitas.

En Objective-C, el software que requiere un servicio anónimo declara un Protocolo. A continuación, los servicios adoptan este protocolo. Los clientes cargan servicios como complementos dinámicos. Por otro lado, si el servidor fue escrito antes que el cliente, se trata simplemente de escribir un nuevo plug-in 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 en el idioma nativo? Realmente me gustaría escuchar un buen argumento en cuanto a 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.

 -1
Author: Bored,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-10 15:58:40

Trabajo con Spring todo el día y he comprobado Groovy. De ninguna manera soy un experto en XCODE/Cocoa, pero IB solo hace alguna inyección de dependencia, lo que Groovy ni siquiera afirma estar haciendo.

Creo que no está buscando DI, sino más bien un conjunto bien compilado de bibliotecas integradas que le ahorra escribir una gran cantidad de código que otras personas también han escrito. Creo que no hay frameworks como Spring para Cocoa porque por alguna razón la gente tiende a ver "Open Source" como " no plataforma dependiente " y por lo tanto Cacao es un poco dejado fuera en el frío.

Sin embargo, dependiendo de sus necesidades, hay algunas bibliotecas gratuitas de código abierto disponibles para Cocoa, todas listadas en CocoaDev en una nice list.

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

 -2
Author: Rolf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-27 20:28:54

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

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

Estoy feliz de estar aunque corregido.

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

Objective-c categories

 -2
Author: groovePupil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-20 07:31:48