La Microsoft.Xna.Framework.Game
clase tiene una propiedad de Servicios que permite al programador agregar un servicio a su juego al proporcionar el tipo de la clase y una instancia de la clase al método Agregar.
Ahora, en lugar de tener que pasar un AudioComponent
a todas las clases y métodos que lo requieren, simplemente pasa su Game
instancia y busca el servicio. ( Localizador de servicio )
Ahora, debido a que los juegos tienen muchos servicios (GraphicsDevice, SceneGraph, AudioComponent, EffectsManager, etc.), básicamente pasarás el Juego a todo.
Entonces, ¿por qué no hacer de estas instancias un Singleton? Bueno, porque los Singleton son malos porque tienen un estado global, evitan las pruebas y hacen que su diseño sea mucho más frágil. Los localizadores de servicios se consideran igualmente un antipatrón para muchos porque en lugar de simplemente pasar la dependencia a un objeto, se pasa un localizador de servicios (el Juego) que combina esa clase con el resto de los servicios.
Entonces, ¿por qué se recomiendan los servicios en XNA y el desarrollo de juegos? ¿Es porque los juegos son diferentes de los programas normales y están altamente entrelazados con sus componentes y tener que pasar todos los componentes necesarios para el funcionamiento de una clase sería muy engorroso? ¿Son los servicios de juegos en ese momento un mal necesario en el diseño de juegos? ¿Existen alternativas que no impliquen largas listas de parámetros y acoplamiento?