Die Microsoft.Xna.Framework.Game
Klasse verfügt über eine Services- Eigenschaft, mit der der Programmierer seinem Spiel einen Service hinzufügen kann, indem er der Add-Methode den Typ der Klasse und eine Instanz der Klasse bereitstellt.
Anstatt ein AudioComponent
an alle Klassen und Methoden zu übergeben, die es erfordern, übergeben Sie jetzt einfach Ihre Game
Instanz und suchen den Dienst. ( Service Locator )
Da Spiele viele Dienste haben (GraphicsDevice, SceneGraph, AudioComponent, EffectsManager usw.), werden Sie das Spiel nun im Grunde an alles weitergeben.
Warum also nicht einfach diese Instanzen zu einem Singleton machen? Nun, weil Singletons schlecht sind, weil sie einen globalen Zustand haben, verhindern Sie Tests und machen Sie Ihr Design viel spröder. Service Locators werden für viele gleichermaßen als Anti-Pattern angesehen, da Sie anstatt nur die Abhängigkeit an ein Objekt zu übergeben, einen Service Locator (das Spiel) übergeben, der diese Klasse mit dem Rest der Services koppelt.
Warum werden dann Dienste für die XNA- und Spieleentwicklung empfohlen? Liegt es daran, dass Spiele sich von regulären Programmen unterscheiden und stark mit ihren Komponenten verflochten sind und es sehr umständlich wäre, jede Komponente zu bestehen, die für das Funktionieren einer Klasse erforderlich ist? Sind Game Services gerade dann ein notwendiges Übel im Spieldesign? Gibt es Alternativen, die keine langen Parameterlisten und Kopplungen erfordern?