web-dev-qa-db-fra.com

Qu'est-ce qu'une racine de composition dans le contexte de l'injection de dépendance?

J'explore l'injection de dépendances et le terme racine de composition est utilisé partout. Alors c'est quoi?

69
Thomas

La racine de composition est le seul endroit de votre application où la composition des graphiques d'objet pour votre application a lieu, à l'aide du conteneur d'injection de dépendances (bien que la façon dont cela soit fait ne soit pas pertinente, elle pourrait utiliser un conteneur ou pourrait être effectuée manuellement à l'aide de - DI pur ).

Il ne devrait y avoir qu'un seul endroit où cela se produit et votre conteneur ne devrait pas avoir besoin d'être utilisé en dehors de la racine de composition.

Citant l'une des réponses liées ci-dessous:

En pratique, cela signifie que vous devez configurer le conteneur à la racine de votre application.

  • Dans une application de bureau, ce serait dans la méthode Main (ou très proche)
  • Dans une application ASP.NET (y compris MVC), ce serait dans Global.asax
  • Dans WCF, ce serait dans une ServiceHostFactory
  • etc.

Il y a une bonne réponse ici qui explique un peu plus à ce sujet.

Voir aussi cette réponse .

64
Sam Holder

Mark Seemann a écrit un excellent article sur le modèle de conception Composition Root.

les points essentiels de cet article sont:

Une racine de composition est un emplacement (de préférence) unique dans une application où les modules sont composés ensemble.

Seules les applications doivent avoir des racines de composition. Les bibliothèques et les frameworks ne devraient pas.

Un conteneur DI ne doit être référencé qu'à partir de la racine de composition. Tous les autres modules ne doivent avoir aucune référence au conteneur.

http://blog.ploeh.dk/2011/07/28/CompositionRoot/

J'ai écrit mon propre framework d'injection de dépendance JavaScript appelé Di-Ninja avec ces principes à l'esprit

https://github.com/di-ninja/di-ninja

Comme je le sais, est le seul en javascript qui implémente le modèle de conception Composition-Root et sa documentation pourrait être un autre bon exemple pour montrer comment cela fonctionne.

Il fonctionne avec NodeJS, navigateur (avec Webpack ou UMD/AMD) et React-Native.

3
Jo-Go