2012-01-20 11 views
3

NinjectとXNAを統合しようとしていますが、すべての問題を解決しようとすると苦労しています。NinjectとXna 4.0の統合

は問題ありません。する必要があります。できるだけデカップリングしてモジュール化しています.Xnaはこれをやってくれて満足していません...これの例はGameオブジェクトが内部的に多くのことを知らせるところであり、その多くは私のオブジェクトに渡されることで可能です。だから、これらをGameクラスにコンストラクタ引数として追加することにしました。そのため、すべての依存関係をセットアップしてから、Ninjectを使用してすべての依存関係が解決されたGameインスタンスを取得できます。

残念なことに、この例では通常、XNAはInitilizeステージに到達するまでSpriteBatchを新規作成しません。GraphicsDeviceManagerを公開する前にGraphicsDeviceを作成するためにGraphicsDeviceManagerを必要とするためです。何かを使用する...

これは、ゲームの中に投入する必要があるため、ゲームに挿入することができないため、ゲームが作成された後には本当に押し込むことができません。世界のコンポーネントも物事を注入され、ゲームにプッシュされます。

この時点で私は自分自身のGraphicsDeviceを作成できたかもしれないと思ったが、ハンドルが必要なので自分のウィンドウも作成する必要があった。後でXNAが破棄して再作成することに気づいた。だから私の口には恐ろしい味が残っています...ゲームや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 
} 

はどちらも例に過ぎません私は新しいゲームを自分自身のように循環依存関係の問題をバイパスします。実際のゲームオブジェクト(ファクトリ、GUIコンポーネントなど)の依存関係を含むGameModuleを除外しました。問題は最終的にGameにも注入する必要があります。

依存関係が解決されるまで注入することはできませんが、ゲームを開始するまでは依存関係を解決することはできません。だから誰も私がどのようにこの問題を乗り越えたのか教えてくれますか?

私はhttp://steveproxna01di.codeplex.com/を見つけましたが、インジェクションアプローチではなくサービスロケータアプローチのほうが多いので、これ以上の例があるかどうかを調べていました。

答えて

0

誰もこれを答えなかったように、私は基本的にルート注入点であるカスタムIGameインスタンスのラッパーとブートストラップに私のゲームのインスタンスになっていることで入れます。こうして、私は何でもしたいものを注入することができます。