9

Je me demande comment je devrais stocker/référencer mes conteneurs d'injection de dépendance. Est-ce normal qu'un conteneur soit une propriété statique sur une classe statique? Ou devrais-je avoir le conteneur être une variable d'instance sur l'application? Je me demande quels sont les avantages et les inconvénients de chaque option, et quelle est la meilleure pratique pour cela dans les applications web, mvc, console et windows?Où dois-je stocker une référence à mon conteneur DI?

+0

en double: http://stackoverflow.com/questions/644747/autofac-in-web-applications-where-should-i-store-the-container-for-easy-access http://stackoverflow.com/ questions/277438/abstrait-ioc-conteneur-derrière-un-singleton-faire-ce-mal http://stackoverflow.com/questions/480286/best-practices-for-ioc-container http://stackoverflow.com/ questions/367178/usage-of-ioc-containers-specific-windsor http://stackoverflow.com/questions/1612682/typical-ioc-container-usage-passing-data-down-the-line –

+1

Merci à tous! Désolé pour tous les doublons - je me suis dit que c'était un dup mais je ne savais pas comment formuler ma question pour les trouver. –

Répondre

5

Je recommande de le stocker en tant que variable d'instance sur l'application. L'utilisation d'une propriété statique - en en faisant un singleton globalement accessible - cache la dépendance de votre application, ce qui est l'une des choses que vous essayez d'éviter en utilisant un conteneur d'injection de dépendance en premier lieu! Cela dit, si votre infrastructure rend difficile l'accès à votre instance d'application, ce ne serait pas la fin du monde d'utiliser une variable statique.

1

Je suis d'accord avec M. Sternal à ce sujet. Une chose à considérer est que certains conteneurs DI implémente IDisposable, donc vous voulez probablement disposer du conteneur à la fin du programme normal. Voir How do you reconcile IDisposable and IoC?

Notez également qu'il est souvent préférable d'éviter de disperser les dépendances sur le conteneur DI dans votre application. En d'autres termes, essayez d'éviter de rendre le conteneur globalement disponible (Singleton, propriété statique, ou même injecté) pour l'utiliser comme Service Locator. Au lieu de cela, vous pouvez utiliser la capacité du conteneur à résoudre les dépendances des dépendances. Par exemple, vous pouvez créer le conteneur au démarrage de l'application et l'utiliser pour construire votre modèle (dans MVC). Le modèle peut dépendre d'un référentiel et d'un service Web. Le référentiel peut dépendre d'un enregistreur. Le conteneur résoudra tous ces éléments lors de la construction du modèle. Si votre modèle a besoin de créer des instances de dépendances à la volée, injectez-lui une fabrique.

+1

D'accord, et comme une affiche l'a mise dans l'un des dupes que Mauricio a déterrés: "Mettez le conteneur du CIO au plus haut niveau/point d'entrée dans le processus et utilisez-le pour injecter des dépendances dans tout ce qui est dessous." (http://stackoverflow.com/questions/480286/best-practices-for-ioc-container) –

+0

@Jeff - Belle citation; simple et précis. Il y a aussi une excellente réponse de Thorsten Lorenz dans ce lien (également de Mauricio): http://stackoverflow.com/questions/480286/best-practices-for-ioc-container – TrueWill

+0

Si vous mettez le conteneur au plus haut niveau, cela crée probablement un besoin de maintenir une référence à votre assemblage de niveau le plus bas qui nécessite une injection (accès aux données peut-être). Cela me irrite un peu :( – dougajmcdonald