La Microsoft.Xna.Framework.Game
classe a une propriété Services qui permet au programmeur d'ajouter un service à son jeu en fournissant le type de la classe et une instance de la classe à la méthode Add.
Maintenant, au lieu d'avoir à passer un AudioComponent
à toutes les classes et méthodes qui en ont besoin, il vous suffit de passer votre Game
instance et de rechercher le service. ( Localisateur de services )
Maintenant, parce que les jeux ont de nombreux services (GraphicsDevice, SceneGraph, AudioComponent, EffectsManager, et cetera), vous allez maintenant passer le jeu à tout.
Alors pourquoi ne pas simplement faire de ces instances un singleton? Eh bien, parce que les singletons sont mauvais parce qu'ils ont un état global, empêchent les tests et rendent votre conception beaucoup plus fragile. Les localisateurs de services sont également considérés comme un anti-modèle pour beaucoup car au lieu de simplement transmettre la dépendance à un objet, vous passez un localisateur de services (le jeu) qui couple cette classe avec le reste des services.
Alors pourquoi les services sont-ils recommandés dans XNA et le développement de jeux? Est-ce parce que les jeux sont différents des programmes réguliers et sont étroitement liés à leurs composants et devoir passer tous les composants nécessaires au fonctionnement d'une classe serait très lourd? Les services de jeux sont-ils alors un mal nécessaire dans la conception de jeux? Existe-t-il des alternatives qui n'impliquent pas de longues listes de paramètres et de couplage?