La Microsoft.Xna.Framework.Game
classe ha una proprietà Services che consente al programmatore di aggiungere un servizio al proprio gioco fornendo il tipo di classe e un'istanza della classe al metodo Add.
Ora, invece di dover passare un AudioComponent
a tutte le classi e i metodi che lo richiedono, basta passare l' Game
istanza e cercare il servizio. ( Service Locator )
Ora, poiché i giochi hanno molti servizi (GraphicsDevice, SceneGraph, AudioComponent, EffectsManager, eccetera), ora passerai sostanzialmente a Game.
Quindi perché non trasformare queste istanze in Singleton? Bene, perché i Singleton sono cattivi perché hanno uno stato globale, impediscono i test e rendono il tuo design molto più fragile. I localizzatori di servizi sono ugualmente considerati un anti-modello per molti perché invece di passare semplicemente la dipendenza a un oggetto, si passa un localizzatore di servizi (il Gioco) che accoppia quella classe con il resto dei servizi.
Allora perché i servizi sono consigliati in XNA e nello sviluppo di giochi? È perché i giochi sono diversi dai normali programmi e sono strettamente intrecciati con i loro componenti e dover passare ogni componente necessario per il funzionamento di una classe sarebbe estremamente ingombrante? I servizi di gioco in quel momento sono un male necessario nella progettazione del gioco? Esistono alternative che non comportano lunghi elenchi di parametri e accoppiamenti?