该Microsoft.Xna.Framework.Game
班有一个服务属性,它允许程序员通过提供一流的类型和类Add方法的一个实例,一个服务添加到他们的游戏。
现在,不必将传递AudioComponent
给需要它的所有类和方法,而只需传递Game
实例并查找服务即可。(服务定位器)
现在,由于游戏具有许多服务(GraphicsDevice,SceneGraph,AudioComponent,EffectsManager等),因此您现在基本上将Game传递给了一切。
那么,为什么不只将这些实例设置为Singleton呢?好吧,因为单例很糟糕,因为它们具有全局状态,可以防止测试,并使您的设计更加脆弱。同样,服务定位器被视为对许多人的反模式,因为您传递的是服务定位器(游戏),而不是将依赖项传递给对象,该服务定位器将此类与其他服务耦合在一起。
那么,为什么在XNA和游戏开发中推荐“服务”呢?是因为游戏不同于常规程序,并且与它们的组成部分高度交织在一起,并且必须通过类的功能所必需的每个组成部分都非常繁琐吗?游戏服务是游戏设计中必不可少的邪恶吗?是否有其他选择不涉及冗长的参数列表和耦合?