スコープ、コンテキスト、名前付きバインディング(およびアクティベーションブロック?)のNinjectの概念を分離して、概念レベルで明確に説明できますか?
例として、データベースからデータレコードをロードし、レコードごとにNinjectファクトリ拡張を介して「ワーカー」を構築するサービスがあります。サービスと個々のワーカーの両方が、EntityFrameworkのオブジェクトコンテキストを使用してデータベースと対話します。ObjectContextは、コンストラクターを介して両方に注入されます(他の共有依存関係も同様です)。現在はシングルスレッドですが、最終的にはワーカーは独自のスレッドで並行して実行する必要があるため、独自のObjectContextインスタンスと明示的な開始/破棄のライフサイクルが必要になります。ObjectContextインスタンスは、ワーカーの「作業単位」の期間中共有する必要があります(したがって、ワーカーが使用する複数のリポジトリーに注入されるため、一時的ではありません)。私はこの機能を取得しようとして立ち往生しています。
私は素朴にこのようなものが欲しかった(名前付きスコープとコンテキスト保存拡張機能を使用):
Bind<MyDbContext>().ToSelf();
Bind<MyService>().ToSelf();
Bind<IWorkerFactory>().ToFactory().InThreadScope(); // scope prob not necessary
Bind<MyWorker().ToSelf().DefinesNamedScope("workerScopeName");
Bind<MyDbContext>().ToSelf().InNamedScope("workerScopeName");
これは明らかに(少なくともNinjectユーザーには明らかです)、MyDbContextが原因で「複数の一致するバインディング...」エラーが発生します。さらに多くのことを読んだ後、私はおそらくワーカーとそのObjectContextに名前付きバインディングを使用する必要があると思います。ワーカーが終了したときにObjectContextを明示的に破棄できるように(そして、スコープの処理からdisposeメソッドを使用できるように)、スコープも必要だと思います。
いずれにせよ、私はまだほとんど推測しているので、誰かがNinjectでこれらの概念を明確にできることを期待して、この質問を投稿しています。