尝试将Ninject与XNA集成,但是我在尝试连接它们时遇到了一些问题。问题在于,我正在尝试按照我认为应该的方式进行操作,因此我尽可能地将其解耦以使其更加模块化,但是Xna对我这样做感到不满...一个例子是Game对象在内部创建了很多东西,而其中很多东西需要传递给我的对象。因此,我决定将它们作为构造函数参数添加到Game类中,这样我就可以设置所有依赖项,然后使用Ninject来提供已解析所有依赖项的Game实例。
不幸的是,在这个例子中,通常情况下,XNA直到到达初始化阶段才会新建SpriteBatch,我认为这是因为它需要GraphicsDeviceManager获取窗口句柄以创建GraphicsDevice,然后才能公开供任何人使用...
因此,由于它需要先完成自己的工作,所以它们不能被注入到游戏中,而且我也不能在游戏创建后再将它们推入,因为我还需要注入其他组件,如World组件,并将它们推入游戏中。
在这一点上,我认为也许我可以创建自己的GraphicsDevice,但是由于我需要handle,我还需要自己创建窗口,后来我意识到XNA会处理并重新创建它。所以这让我感到非常不爽......因为我不想重写Game和GraphicsDeviceManager类,这将要求我重新编写许多其他功能,因为它们都是XNA程序集的内部功能...
然后是游戏构造函数:
不幸的是,在这个例子中,通常情况下,XNA直到到达初始化阶段才会新建SpriteBatch,我认为这是因为它需要GraphicsDeviceManager获取窗口句柄以创建GraphicsDevice,然后才能公开供任何人使用...
因此,由于它需要先完成自己的工作,所以它们不能被注入到游戏中,而且我也不能在游戏创建后再将它们推入,因为我还需要注入其他组件,如World组件,并将它们推入游戏中。
在这一点上,我认为也许我可以创建自己的GraphicsDevice,但是由于我需要handle,我还需要自己创建窗口,后来我意识到XNA会处理并重新创建它。所以这让我感到非常不爽......因为我不想重写Game和GraphicsDeviceManager类,这将要求我重新编写许多其他功能,因为它们都是XNA程序集的内部功能...
那么有人成功设置了他们的依赖注入,而不必重写大量的XNA代码吗?
这是我当前模块的一个示例:
public class XnaModule : NinjectModule
{
public override void Load()
{
Kernel.Bind<IServiceProvider>().To<NinjectServiceProvider>().InSingletonScope();
Kernel.Bind<IGraphicsDeviceService>().To<GraphicsDeviceManager>().InSingletonScope();
Kernel.Bind<ContentManager>().ToSelf().InSingletonScope();
Kernel.Bind<SpriteBatch>().ToSelf().InSingletonScope();
var contentManager = new ContentManager(Kernel.Get<IServiceProvider>());
contentManager.RootDirectory = "Content";
Kernel.Bind<ContentManager>().ToConstant(contentManager).InSingletonScope();
var game = new MyGame(Kernel.Get<IGraphicsDeviceService>() as GraphicsDeviceManager,
Kernel.Get<SpriteBatch>(), contentManager);
Kernel.Bind<Game>().ToConstant(game).InSingletonScope();
}
}
然后是游戏构造函数:
public class MyGame : Game
{
public SpriteBatch SpriteBatch { get; private set; }
public GraphicsDeviceManager Graphics { get; private set; }
public MyGame(GraphicsDeviceManager graphics, SpriteBatch spriteBatch, ContentManager contentManager)
{
Graphics = graphics;
SpriteBatch = spriteBatch;
Content = contentManager;
}
// Other stuffs
}
这只是一些示例,让您了解我所采取的方法,该模块绕过了循环依赖问题,因为我自己新建了游戏。我已经排除了GameModule,其中包含我的实际游戏对象的依赖项,例如工厂、GUI组件等等,问题是它们最终也需要注入到游戏中,这就形成了一个进退两难的局面。
由于在解决依赖项之前无法注入它们,但在启动游戏之前又无法解决依赖关系... 这似乎是一个失利的局面。那么有人能告诉我他们如何解决这个问题吗?
我找到了http://steveproxna01di.codeplex.com/,但还在寻找更多示例,因为这更像是一种服务定位器方法,而不是注入方法。