6

スコープコンテキスト名前付きバインディング(およびアクティベーションブロック?)の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でこれらの概念を明確にできることを期待して、この質問を投稿しています。

4

1 に答える 1

9

コンテキスト:現在の解決のメタ情報。これは、オブジェクトツリーのどこに現在解決されているオブジェクトが注入されるかを指定します。(たとえば、現在解決されているオブジェクトは、クラスBに注入されるクラスAのコンストラクターに注入されます...)これは、たとえば、Whenオーバーロードの1つを使用して現在のコンテキストにバインディングを適用するかどうかを決定するために使用できます。これは、流暢な構文の他の多くのコールバックにも渡されます(InScope、OnActivationなど)。

スコープ:オブジェクトのライフサイクルを定義し、既存のインスタンスをいつ再利用するかを定義します。多くの事前定義されたスコープと、現在のコンテキストからスコープを指定できる汎用スコープがあります(InScope(ctx => ...

名前付きバインディング:バインディングに関するメタ情報。コンテキストと組み合わせて使用​​できます。たとえば、バインディングは、現在のコンテキストで親バインディングのいずれかに何らかの名前がある場合にのみ適用されます。

アクティベーションブロック: (Ninject2.x-3.xの時点で、これは将来のバージョンで変更される可能性があります)。アクティベーションブロック内で、各バインディングは、スコープとしてアクティベーションブロックを持つように変更されます。これは、バインディングで指定されたスコープが無視されることを意味します。1つのアクティベーションブロックで解決するために、正確に1つのインスタンスが作成されます。

のような他のすべての種類のスコープを無視することによって欠陥があるため、私は個人的にその機能を使用しませんInSingletonScope。Ninject.Extensions.NamedScopeで指定されたスコープを使用することをお勧めします。

あなたの例に関して:あなたは2つのMyDbContextバインディングを持っているので、それらに条件を追加する必要があります。例:WhenAnyAncestorNamedInCallScope()または、1つのバインディングだけのように別のスコープを使用することもできます。

于 2013-01-30T11:29:06.210 に答える