Les deux modèles semblent être une mise en œuvre du principe d'inversion de contrôle. Autrement dit, un objet ne doit pas savoir comment construire ses dépendances.
L'injection de dépendance (DI) semble utiliser un constructeur ou un setter pour «injecter» ses dépendances.
Exemple d'utilisation de l'injection de constructeur:
//Foo Needs an IBar
public class Foo
{
private IBar bar;
public Foo(IBar bar)
{
this.bar = bar;
}
//...
}
Le localisateur de service semble utiliser un "conteneur", qui connecte ses dépendances et donne foo c'est bar.
Exemple d'utilisation d'un localisateur de service:
//Foo Needs an IBar
public class Foo
{
private IBar bar;
public Foo()
{
this.bar = Container.Get<IBar>();
}
//...
}
Parce que nos dépendances ne sont que des objets eux-mêmes, ces dépendances ont des dépendances, qui ont encore plus de dépendances, et ainsi de suite. Ainsi, l'Inversion of Control Container (ou DI Container) est né. Exemples: Castle Windsor, Ninject, Structure Map, Spring, etc.)
Mais un conteneur IOC / DI ressemble exactement à un localisateur de service. L'appeler un conteneur DI est-il un mauvais nom? Un conteneur IOC / DI n'est-il qu'un autre type de localisateur de service? La nuance réside-t-elle dans le fait que nous utilisons les conteneurs DI principalement lorsque nous avons de nombreuses dépendances?