У Microsoft.Xna.Framework.Game
класса есть свойство Services, которое позволяет программисту добавлять сервис в свою игру, предоставляя тип класса и экземпляр класса методу Add.
Теперь вместо того, чтобы передавать AudioComponent
все классы и методы, которые в этом нуждаются, вы просто передаете свой Game
экземпляр и ищите сервис. ( Сервисный Локатор )
Теперь, поскольку в играх много сервисов (GraphicsDevice, SceneGraph, AudioComponent, EffectsManager и т. Д.), Теперь вы будете в основном передавать Game всем.
Так почему бы просто не сделать эти экземпляры Singleton? Ну, потому что Singletons плохи, потому что они имеют глобальное состояние, предотвращают тестирование и делают ваш дизайн намного более хрупким. Локаторы сервисов в равной степени считаются антишаблоном для многих, поскольку вместо простой передачи зависимости объекту вы передаете локатор сервисов (игру), который связывает этот класс с остальными сервисами.
Итак, почему Услуги рекомендуются в XNA и разработке игр? Не потому ли, что игры отличаются от обычных программ и тесно переплетены со своими компонентами, а необходимость проходить через каждый компонент, необходимый для функционирования класса, была бы весьма обременительной? Являются ли Game Services именно тогда необходимым злом в игровом дизайне? Существуют ли альтернативы, которые не включают длинные списки параметров и связь?