2009-10-03 25 views
18

¿Hay algún lenguaje de programación actual que explícitamente tenga inyección de dependencia como característica de idioma? De ser así, ¿hay algún ejemplo de cómo estos lenguajes de programación usan su sintaxis para separar dependencias de programa de sus implementaciones concretas?Dependency Injection como característica de idioma?

(Tenga en cuenta que no estoy buscando un marco DI/IOC: estoy buscando un lenguaje de programación que tenga esta característica incorporada en el lenguaje).

Respuesta

10

No encontrará la inyección de dependencia como una función de idioma, ya que generalmente se ve como un patrón de diseño. Los patrones de diseño surgen como soluciones provisionales para las características de idioma faltantes; por ejemplo, si tiene tipos de primera clase como función de idioma, no necesita el patrón de fábrica (consulte p12 de Norvig's presentation), si tiene métodos múltiples como función de idioma, no lo hace Necesito el patrón de envío doble.

La característica de idioma para la cual DI es el patrón de diseño es "módulos paramétricos". Ver el discussion of modules vs DI relacionado con el lenguaje de Gilad Bracha Newspeak

+3

Y vea también la discusión sobre "Los patrones de diseño son signos de debilidad en los lenguajes de programación" - http://www.oreillynet.com/onlamp/blog/2006/10/design_patterns_are_signs_of_w.html – avandeursen

+0

Algunos idiomas * do * brindan un servicio localizador como una característica de idioma. Por ejemplo, Python. – Arafangion

+0

@Arafangion te refieres a la declaración de importación http://docs.python.org/reference/index.html, o alguna otra cosa en el idioma (a diferencia de una biblioteca)? Tener una ruta de búsqueda de módulos es bastante menor que la ubicación del servicio, y la inyección de dependencia no es igual a la ubicación del servicio. –

4

No quiero sonar como un idiota, pero cada idioma de OO admite inyección de dependencia. No se requiere una sintaxis especial. Simplemente construya su objeto con sus dependencias (o establezca sus dependencias más adelante).

En realidad, puede cablear todas sus dependencias en algún lugar cerca de la parte superior del programa, no necesariamente main(), pero cerca de la parte superior.

+2

No estoy buscando un lenguaje de programación que te permita implementar la inyección de dependencia, en realidad estoy buscando un lenguaje que ays "Quiero crear un IFoo" y luego el compilador/tiempo de ejecución decide qué se crea sin especificar las clases concretas en tiempo de compilación. – plaureano

+0

Ah, creo que está buscando soporte de idiomas para el autoenvío o el descubrimiento automático de servicios. Mi error. –

3

Noop supuestamente hace esto, pero no he visto las especificaciones del lenguaje (mi paciencia se agotó antes de encontrarla).

+1

La propuesta de inyección para noop se trata en http://code.google.com/p/noop/wiki/Features y http://code.google.com/p/noop/wiki/ProposalForNewableVsInjectable La propuesta para noop el soporte de inyección se basará en el marco de inyección Guice de Google. http://code.google.com/p/google-guice/ – avandeursen

+0

Parece que Noop es una lengua muerta. No ha habido ninguna actividad en el foro de idiomas Noop desde hace bastante tiempo. – plaureano

2

Se podría decir que Scala admite la inyección de dependencia de la caja con la ayuda de rasgos y anotaciones de tipo propio. Echar un vistazo en un modelo de la torta:

http://jonasboner.com/2008/10/06/real-world-scala-dependency-injection-di/

Básicamente, este enfoque utiliza rasgos con las dependencias declaradas (mediante el uso de auto-tipos) para que el compilador de hacer el trabajo de cableado juntos.

Este es el registro de la declaración:

object ComponentRegistry extends 
    UserServiceComponent with 
    UserRepositoryComponent 
{ 
    val userRepository = new UserRepository 
    val userService = new UserService 
} 

... registrar el depósito de usuarios:

trait UserRepositoryComponent { 
    val userRepository: UserRepository 

    class UserRepository { 
    ... 
    } 
} 

... y el componente de servicio de usuario que depende del repositorio:

trait UserServiceComponent { 
    this: UserRepositoryComponent => 

    val userService: UserService 

    class UserService { 
    ... 
    } 
} 
+0

+1 para Scala. Echa un vistazo a la IMPRESIONANTE charla, [Inyección de dependencia muerta-simple] (http://www.youtube.com/watch?v=ZasXwtTRkio) Runar es súper inteligente, y también hilarante: "Inversion of Control", que en realidad es solo una manera pretenciosa de decir 'tomar una discusión' " – CrazyPyro

Cuestiones relacionadas