Je ne savais pas que ça pouvait s'appeler comme ça mais c'est le genre de truc que j'utilise.
Dans les faits un conteneur de service, c'est juste un objet qui en contient d'autres qui sont appelables par leur nom. On choisit des noms courts sans contraintes par rapport aux noms des classes utilisées, tout est bien nommé, bien rangé, c'est propre.
Le conteneur de services ne dure que l'exécution du script mais permet une persistance des objets qui ne sont initialisé qu'une fois (ce que fait le pattern singleton).
La différence avec les singletons c'est qu'on peut avoir autant de conteneur de service que l'on veut.
Dans la pratique, on utilise qu'un seul conteneur dans toute l'application (ce qui peut faire penser que ce n'est pas plus utile qu'un simple singleton).
Le conteneur de service peut offrir d'autres fonctionnalités que la simple instanciation comme des mécanismes de configuration unifié lors de l'initialisation d'un service (juste après l'instanciation de l'objet).
Et le conteneur de service fait indirectement du pattern factory, cela permet de ne pas avoir de déclaration de namespaces au niveau de l'implémentation. Ça minimise le nombre de ligne à retoucher en cas de renommage de namespace, de changement de librairie etc.
Un cas de bad practise : il est possible de mettre un conteneur de service en singleton.
PierreC a écrit :
Surtout que le code n'a nullement besoin de singleton, au contraire un jour on aura besoin de plusieurs instances d'un même objet. Mais ca ils ne l'ont peut être pas imaginé encore.
|
Un conteneur de service correctement conçu permet d'avoir plusieurs instances d'une même classe mais configurés/initialisés différemment. S'il existe une autre contrainte, c'est que le conteneur de service ne répond pas au besoin et donc il ne faut pas l'utiliser pour cet usage.
Message édité par czh le 08-11-2017 à 23:29:36