A Microsoft.Xna.Framework.Game
classe possui uma propriedade Services que permite ao programador adicionar um serviço ao jogo, fornecendo o tipo da classe e uma instância da classe ao método Add.
Agora, em vez de passar um AudioComponent
para todas as classes e métodos que o exigem, basta passar sua Game
instância e procurar o serviço. ( Localizador de serviço )
Agora, como os jogos têm muitos serviços (GraphicsDevice, SceneGraph, AudioComponent, EffectsManager etc.), agora você estará basicamente passando o Game para tudo.
Então, por que não apenas tornar essas instâncias um Singleton? Bem, porque Singletons são ruins porque têm um estado global, impedem testes e tornam seu design muito mais frágil. Os localizadores de serviço são igualmente considerados um antipadrão para muitos, porque, em vez de apenas passar a dependência para um objeto, você passa um localizador de serviço (o Jogo) que combina essa classe com o restante dos serviços.
Então, por que os Serviços são recomendados no XNA e no desenvolvimento de jogos? É porque os jogos são diferentes dos programas regulares e estão altamente interligados com seus componentes e ter que passar por todos os componentes necessários para o funcionamento de uma classe seria altamente complicado? Os serviços de jogos são um mal necessário no design de jogos? Existem alternativas que não envolvam longas listas de parâmetros e acoplamentos?