2010-04-21 12 views
8

Je cours Pharo et je suis juste dans un cas d'utilisation ce genre de cris pour Dependency Injection à la Guice. Y a-t-il quelque chose de similaire pour Smalltalk?Existe-t-il un cadre d'injection de dépendances pour Smalltalk?

Je comprends que vous pouvez tout faire à pied, en passant simplement dans vos dépendances explicitement. Mais cela me semble maladroit et bavard.

+1

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

+0

@MauricioScheffer: Cette question traite de l'inversion de contrôle, qui n'est pas la même que celle de l'injection de dépendances. DI est un modèle dans lequel les clients d'un objet peuvent remplacer les dépendances de l'objet par d'autres de leur choix, ce qui rend l'objet plus réutilisable et plus testable (si c'est bien fait). IoC est un modèle dans lequel le code de l'application s'enregistre avec un framework, et le framework appelle ensuite le code de l'application, plutôt que le code de l'application appelant directement le code du framework. Ceci est parfois caractérisé comme "Ne nous appelez pas, nous vous appellerons". – Peeja

Répondre

4

Il existe un dialecte Smalltalk mettant fortement l'accent sur l'injection de dépendances. Il étend le langage de telle sorte que non seulement les noms de méthodes mais aussi les noms de classes utilisent une recherche dynamique. La nouvelle recherche de noms de classes est la plus proche de celle des méthodes, à l'exception de la recherche de bulles dans une série de classes imbriquées plutôt que le long d'une chaîne d'héritage. Vous pouvez ainsi modifier les classes injectées en modifiant l'environnement d'imbrication.

Pour en savoir plus sur le dialecte, follow this link.

+0

Oui, je connais Newspeak. Mais Guice vous permet d'injecter plus que des noms de classe. Vous pouvez également l'utiliser pour injecter élégamment différentes connexions à une base de données, selon que vous testez ou non (portée). Sûrement, vous pouvez modéliser cela dans Newspeak avec élégance. Mais, en soi, il ne vient pas avec une notion de «portée», ce qui serait utile pour mon cas d'utilisation. – nes1983

1

With Guice, il semble que vous définissiez vos classes pour prendre certaines interfaces en tant que paramètres constructeurs. Ensuite, vous dites à Guice "cette interface correspond à cette classe implémentant cette interface".

Ce genre de chose est complètement inutile dans Smalltalk, car les classes Smalltalk ne se soucient que des protocoles. Si nous traduisons l'exemple en Smalltalk, nous pourrions passer n'importe quel objet que nous avons aimé dans le constructeur de RealBillingService, tant que cet objet a répondu à #logChargeResult: et #logConnectException: c'est-à-dire tant que cet objet a implémenté le protocole requis d'un TransactionLog.

Here's a link à une réponse similaire à celle ci-dessus.

+0

Qu'est-ce que le guice est, il injecte des choses dans votre programme en fonction d'une configuration. Pensez, par exemple, à SandstoneDB (http://onsmalltalk.com/sandstonedb-simple-activerecord-style-persistence-in-squeak). Là, vous écrivez "personne enregistrer" pour écrire l'objet personne sur le disque. Comment la personne trouve-t-elle sa propre base de données? Il regarde dans une constante globale pour la base de données par défaut. C'est une API élégante, mais craint pour les tests. Guice donnerait à la personne un moyen propre de trouver sa base de données. Je vous assure que le problème que Guice résout n'a pas été introduit par les interfaces. – nes1983