46 votes

Pourquoi MVC4 utilise-t-il l'Anti-Pattern de Service Locator?

Après la lecture de "l'Injection de Dépendance .NET" par Mark Seemann-je rester à l'écart de la Localisateur de Service qui est un anti-pattern.

Au moment de lire les notes de version sur MVC 4 , je vois:

L'amélioration de l'Inversion de Contrôle (IoC) via DependencyResolver: API Web maintenant utilise le service locator modèle mis en œuvre par MVC dépendance de résolution pour obtenir des instances pour de nombreuses installations différentes.

Donc je suis de gauche curieux et confus pourquoi Microsoft serait d'utiliser un localisateur de service en 2012.

50voto

Darin Dimitrov Points 528142

C'est un détail d'implémentation qui ne devrait pas s'en soucier. La chose importante est que maintenant que le Web API utilise la DependencyResolver à résoudre des dépendances pour de nombreuses installations différentes, vous serez en mesure d'utiliser un vrai injection de dépendance à chaque fois que vous voulez le brancher dans ces installations. Donc, dans votre code, vous serez à l'aide d'une véritable injection de dépendance. Si Microsoft n'a pas utilisé l' DependencyResolver alors qu'il aurait été que vous devez avoir utilisé (comme un localisateur de service anti-pattern) dans votre code, afin de résoudre les dépendances lorsque vous souhaitez mettre en œuvre une fonctionnalité personnalisée. Cela aurait été mauvais pour vous. Maintenant, c'est mauvais pour Microsoft , mais vous ne se soucient pas d'eux.

Donc je suis de gauche curieux et confus pourquoi Microsoft serait d'utiliser un localisateur de service en 2012.

En raison de la conception d'un framework n'est pas la même que la conception d'une application à l'aide d'un cadre. Il y a quelques différentes choses à prendre en considération lors de la conception d'un cadre réutilisable comme ASP.NET MVC plutôt que juste ce qui est écrit dans les livres. Un exemple est, pour la conception du cadre de telle manière qu'une personne à l'aide de ce cadre sera en mesure de tirer parti des meilleures pratiques de l'écrit dans les livres, dans son code à l'aide de ce cadre.

35voto

Haacked Points 31070

Comme Darin points, ASP.NET MVC 4 est un Cadre et un conteneur est agnostique. C'est pourquoi il offre un localisateur de service sous la forme d' IDependencyResolver. Cela permet à quiconque de brancher leur conteneur de choix.

Cependant, je n'appellerais pas cela un anti-modèle. Cela vous permet d'utiliser le conteneur de votre choix, mais il n'a pas la force de vous le développeur de l'application pour l'utilisation du service de localisation. Si le cadre a forcé les développeurs à utiliser le Service de Localisation, alors je dirais que c'est un anti-modèle. Mais le développeur qui crée un ASP.NET MVC de l'application est libre d'utiliser DI via le constructeur de l'injection, la configuration de la propriété, ou l'endroit. C'est leur choix.

Regardez tous les ASP.NET MVC exemples de l'injection de dépendance publié par moi-même ou le ASP.NET MVC équipe. Dans presque tous les cas, ils sont à l'aide du constructeur d'injection. Ils ne sont pas à l'aide de l'emplacement du service.

En fait, la plupart des ASP.NET MVC code source lui-même ne doit pas utiliser le service de localisation pour récupérer les dépendances. Il y a quelques endroits clés où le MVC appels dans le service locator pour héritage et d'Api. Mais c'est tout.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X