【问题标题】:Integrating Ninject with Xna 4.0将 Ninject 与 Xna 4.0 集成
【发布时间】:2012-01-20 22:54:40
【问题描述】:

尝试将 Ninject 与 XNA 集成,但是尝试将其全部连接起来有点痛苦。

问题是我正在尝试按照我认为应该完成的方式去做,所以我尽可能地解耦以使其更加模块化,而 Xna 对我这样做并不满意这……一个例子是游戏对象在内部通知了很多事情,其中​​很多事情可以通过传递给我的对象来完成。所以我决定将这些作为构造函数参数添加到 Game 类中,这样我就可以设置所有依赖项,然后使用 Ninject 为我提供所有依赖项都已解决的 Game 实例。

不幸的是,在这个例子中,XNA 通常不会更新它的 SpriteBatch,直到它进入 Initilize 阶段,我认为这是因为它需要 GraphicsDeviceManager 来获取窗口句柄来创建 GraphicsDevice 之前它可以被暴露给任何东西使用...

因此,它们不能被注入到游戏中,因为它需要先做它的东西,而在游戏制作完成后我不能真正将它们推入,因为我需要像 World 组件这样的其他东西来注入东西也被推入游戏中。

此时我想也许我可以创建自己的 GraphicsDevice,但由于我需要句柄,所以我也需要创建自己的窗口,后来我意识到 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 组件等,问题是它们最终也需要注入到游戏中,然后我们就有了一个 catch22。

由于在解决依赖关系之前无法注入它们,但在开始游戏之前无法解决依赖关系......这似乎是一个输/输的情况。那么谁能告诉我他们是如何解决这个问题的?

我确实找到了http://steveproxna01di.codeplex.com/,但正在寻找是否有更多示例,因为这更像是一种服务定位器方法,而不是一种注入方法。

【问题讨论】:

    标签: dependency-injection xna ninject


    【解决方案1】:

    由于没有人回答这个问题,我将说明我基本上将我的 Game 实例变成了自定义 IGame 实例的包装器和引导程序,这是根注入点。这样我就可以注入任何我想要的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      • 2011-08-30
      • 2021-02-18
      • 1970-01-01
      相关资源
      最近更新 更多