3

これがシナリオです。このサービスが呼び出されると、別のクラスのインスタンス (Ninject を介して作成) に制御が渡されます。そのクラスでは、特に Entity Framework とリポジトリを使用して、いくつかの作業を行う必要があります。簡単に言うと、次のバインディングを宣言しています。

Bind<IGenericProductRepository>()
    .To<GenericProductRepository>()
    .WithConstructorArgument( "context", new StagingDataContext());

このリポジトリを使用したいときは、次のものがあります。

using (var genericProductRepository = IoC.Resolve<IGenericProductRepository>())

問題は、まったく新しいリクエストの場合に genericProductRepository の新しいインスタンスしか取得できないことです。メソッドが同じリクエストで複数回呼び出された場合、コンテキスト (EF コンテキスト) が既に破棄されていることを示すエラーが表示されます。これはusing ステートメントで既に破棄されているのと同じインスタンスを取得しているように見えるためです。別の言い方をすると、Microsoft WCF テスト クライアントを使用して、初めて呼び出した場合、コードは正常に実行されます。呼び出しボタンをもう一度押すと (テスト クライアントを再起動せずに、つまり同じ要求)、このエラーがスローされます。すでに処分されていることについて。

Ninject に付属するさまざまな「スコープ」をいじってみましたが、明らかに何かが欠けています。

私の基本的な質問は、同じものを使用する代わりに、その行にヒットするたびに新しいリポジトリを取得するにはどうすればよいですか? 助けていただければ幸いです。私は会社に Ninject を採用し、Spring を廃止するよう強く求めています。

4

1 に答える 1

3

バインディングをもう一度見てください。Ninject についての知識がなくても、バインディングが定義されたときにコンテキストのインスタンスが 1 回だけ作成されることに気付くはずです。しかし、あなたが望むのは、解決ごとに新しいコンテキストを持つことです。WithConstructorArgument を使用せず、Ninject にインスタンスを作成させるのが最善です。したがって、コンテキストのタイプに対して追加のバインディングを定義する必要があります。これが何らかの理由で不可能な場合は、怠惰なバージョンの WithConstructorArgument を使用する必要があります

WithConstructorArgument("context", ctx => new StagingDataContext())

さらに、Ninject の WCF 拡張機能を試してみることをお勧めします: https://github.com/ninject/ninject.extensions.wcf

そうすれば、ServiceLocator のような使用法を取り除くことができます。

于 2011-03-30T08:41:38.113 に答える