Services i XNA Framework, hur använder jag dem?

En rätt trevlig implementationsdetalj i XNA Framework är användningen och exponeringen av så kallade services. Det går ut på att implementera komponenter som i sin tur exponerar ett publikt interface (som naturligtvis också implementeras) och som andra komponenter sedan kan få tillgång till och använda dess funktionalitet. I korthet går det till på följande sätt, med exemplet för hur en 3D-kamera skulle kunna implementeras (och har gjorts i flera fall):

1. Skapa ett interface, förslagsvis enligt följande:

interface ICamera

{

    Matrix ProjectionMatrix { get; }

    Matrix ViewMatrix { get; }

}

2. Detta interface implementeras sedan av en kamera klass som också ärver från GameComponent

class MyCamera : GameComponent , ICamera

{

...

3. I konstruktorn till denna kameraklass registrerar du sedan kameran som en tjänst

public MyCamera(Game game) : base(game)

{

    game.Services.AddService(typeof(ICamera), this);

}

4. Sedan kan du i någon annan komponent (eller annan klass som har tillgång till Game-instansen) helt enkelt ropa på den tjänst som implementerar kamera-interfacet

public override void Draw(GameTime gameTime)

{

    ICamera fpsCamera = base.Game.Services.GetService(typeof(ICamera)) as ICamera;

    Draw(fpsCamera.ViewMatrix, fpsCamera.ProjectionMatrix);

    base.Draw(gameTime);

}

Ganska snyggt, eller hur?