2010-04-13 10 views
2

AVERTISSEMENT: Je sais qu'il y a un débat entre les modèles de DI et de localisateur de service. J'ai une question qui vise à éviter le débat. Cette question est pour les fans de localisateur de service, qui se trouvent à penser que Fowler "DI ... est difficile à comprendre ... dans l'ensemble, je préfère l'éviter à moins que j'en ai besoin." Pour les fins de ma question, je dois éviter DI (raisons intentionnellement non données), donc je suis pas en essayant d'éveiller un débat sans rapport avec ma question.Le conteneur "enfant" du CIO/localisateur de service

QUESTION: Le seul problème que je pourrais voir avec le maintien de mon conteneur IOC dans un singleton (rappelez-vous mon avertissement ci-dessus), est l'utilisation de conteneurs pour enfants. On peut supposer que les conteneurs pour enfants ne seraient pas eux-mêmes des singletons. Au début, j'ai pensé que cela posait un réel problème. Mais en y réfléchissant, j'ai commencé à penser que c'est exactement le comportement que je veux (les contenants pour enfants ne sont pas des singletons, et peuvent être disposés à volonté). Puis mes pensées sont allées plus loin dans un domaine philosophique. Parce que je suis un fan de localisateur de services, je me demande à quel point la notion de conteneur enfant est nécessaire. Dans un petit nombre de cas où j'en ai vu l'utilité, il s'agissait soit de satisfaire DI (ce que j'évite surtout de toute façon), soit le problème pouvait être résolu sans avoir recours au conteneur du CIO. Mes pensées ont été en partie inspirées par le IServiceLocator interface qui ne prend même pas la peine d'énumérer une méthode "GetChildContainer". Donc, ma question est la suivante: si vous êtes un fan de localisateur de services, avez-vous constaté que les conteneurs pour enfants sont habituellement sans intérêt? Sinon, quand ont-ils été essentiels? Crédit supplémentaire: S'il y a d'autres problèmes philosophiques avec le localisateur de services dans un singleton (mis à part ceux posés par les défenseurs de l'ID), de quoi s'agit-il?

Répondre

3

à mon humble avis:

  • conteneurs enfants ont rien à voir avec localisateurs de service, à savoir qu'ils sont orthogonales. Utiliser un conteneur en tant que localisateur de service n'est que cela, une façon de l'utiliser, et cela n'a rien à voir avec le conteneur qui supporte les conteneurs enfants ou pas.
  • L'utilisation des conteneurs pour enfants dépend largement de la conception du conteneur. Par exemple, même si Windsor les soutient, ils sont rarement utilisés. Autofac OTOH les utilise fortement pour gérer les cycles de vie des composants/composants. Et c'est une fonctionnalité entièrement facultative de toute implémentation de localisateur de conteneur/service, c'est pourquoi IServiceLocator ne le mentionne pas. Le travail de IServiceLocator consiste à fournir le plus petit dénominateur commun dans un localisateur de service.
+0

Votre réponse est exactement ce que je cherchais, et même mieux! Vous avez pris le temps de souligner à quelle fréquence les conteneurs pour enfants sont utilisés dans divers cadres (un astérisque * très * utile) !!! Peut-être que je pourrais vous déranger une fois de plus: où Unity se situe-t-il dans le spectre de la «fréquence des conteneurs pour enfants»? Les conteneurs pour enfants sont-ils plus utilisés dans Unity que Windsor (peu fréquent) ou plus comme Autofac (fréquemment)? –

+0

Désolé, je n'ai aucune expérience significative avec Unity. –