2010-04-21 9 views
8

Estoy ejecutando Pharo y estoy en un caso de uso que tipo de gritos para Dependency Injection à la Guice. ¿Hay algo similar para Smalltalk?¿Hay un marco de inyección de dependencia para Smalltalk?

Entiendo que puede hacer todo a pie, simplemente pasando sus dependencias de forma explícita. Pero eso se siente incómodo y detallado para mí.

+1

http://stackoverflow.com/questions/243905/smalltalk-and-ioc –

+0

@MauricioScheffer: Esa pregunta discute Inversión de control, que no es lo mismo que Inyección de dependencia. DI es un patrón en el que los clientes de un objeto pueden reemplazar las dependencias del objeto con otras de su elección, lo que hace que el objeto sea más reutilizable y más comprobable (si se hace bien). IoC es un patrón en el que el código de la aplicación se registra con un marco, y luego el marco llama al código de la aplicación, en lugar del código de la aplicación que llama directamente al código del marco. Esto a veces se caracteriza como "No nos llames, te llamaremos". – Peeja

Respuesta

4

Hay un dialecto Smalltalk con gran énfasis en la inyección de dependencia. Extiende el lenguaje de manera que no solo los nombres de los métodos, sino también los nombres de las clases usan una búsqueda dinámica. La búsqueda novedosa de nombres de clase es muy similar a la de los métodos, excepto que surge a través de una serie de clases anidadas en lugar de a lo largo de una cadena de herencia. Por lo tanto, puede cambiar las clases inyectadas cambiando el entorno de anidamiento.

Para obtener más información sobre el dialecto, follow this link.

+0

Sí, sé de Newspeak. Pero Guice te permite inyectar más que nombres de clase. También puede usarlo para inyectar inteligentemente conexiones de bases de datos diferentes, dependiendo de si está probando o no (alcance). Sin duda, puedes modelar eso en Newspeak con elegancia. Pero, en sí mismo, no viene con una noción de "alcance", que sería útil para mi caso de uso. – nes1983

1

With Guice, parece que define sus clases para tomar ciertas interfaces como parámetros de constructor. Luego le dices a Guice "esta interfaz asigna a esa clase la implementación de dicha interfaz".

Lo de sort sort es completamente innecesario en Smalltalk, porque las clases de Smalltalk solo se preocupan por los protocolos.

Si traducimos el ejemplo a Smalltalk, podríamos pasar cualquier objeto que nos guste al constructor de RealBillingService, siempre que ese objeto responda a #logChargeResult: y #logConnectException :, es decir, siempre que ese objeto implemente el protocolo requerido de un TransactionLog.

Here's a link a una respuesta similar a la anterior.

+0

Lo que hace Guice es inyectar cosas en su programa dependiendo de una configuración. Piense en, digamos, SandstoneDB (http://onsmalltalk.com/sandstonedb-simple-activerecord-style-persistence-in-squeak). Allí, escribe "persona guardar" para escribir la persona objeto en el disco. ¿Cómo encuentra la persona su propia base de datos? Busca en una constante global para la base de datos predeterminada. Esa es una API elegante, pero es una mierda para las pruebas. Guice le daría a la persona una manera limpia de encontrar su base de datos. Te aseguro que el problema que soluciona Guice no fue introducido por las interfaces. – nes1983

Cuestiones relacionadas