0

コンテキストを としてバインドするとInRequestScope、DelegatingHandler のコードが呼び出されたときにコンテキストが破棄されます (Application_Start でインスタンス化され、コントローラーが初期化される前に実行されます)。InTransientScope を使用すると機能しますが、すべてに対して 1 つのコンテキストが必要です。この回答hereに基づいて、1 つのコンテキストを持つ正しい方法です。

Global.asax

static void Configure(HttpConfiguration config)
{
    var kernel = NinjectWebCommon.Bootstrapper.Kernel;
    config.MessageHandlers.Add(new ApiKeyHandler(kernel.Get<IApiService>()));
}

バインディング

//if i remove InRequestScope here, everything works.
kernel.Bind<EntityDatabaseContext>().ToMethod(context => new EntityDatabaseContext()).InRequestScope();
kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope();

//repositories
kernel.Bind<IRepository<Application>>().To<Repository<Application>>().InRequestScope();

//services
kernel.Bind<IApiService>().To<ApiService>().InRequestScope();

したがってSendAsync、ApiKeyHandler で呼び出されるたびに、コンテキストは既に破棄されています。しかし、(ApiKeyHandler を呼び出した後に) コントローラーが呼び出されると、コンテキストは問題ありません。何が起こっているのかよくわかりません。InRequestScope で動作しない場合、リンクされた質問の回答のように、どうすればそれを達成できますか? 1 つのコンテキスト InTransientScope と InRequestScope 内の他のすべてのコンテキスト?

4

1 に答える 1

1

メッセージ ハンドラーに一時的またはシングルトン スコープのコンテキストを使用すると、メッセージ ハンドラーのすべてのエンティティがキャッシュされるという制限が生じます。たとえば、エンティティが変更/削除された場合、または新しいエンティティが追加された場合、メッセージ ハンドラーはその変更に適応しません。これは、データがまったく変更されない一部のシナリオでは問題ありません。

変更される最新のデータを操作する必要がある場合は、これらのスコープを使用できません。ただしInRequestScope、ファクトリを使用するたびにサービスの新しいインスタンスを作成する必要があることを意味します (ファクトリ拡張を参照)。そうすれば、コンテキストをリクエストスコープに含めることができます。

于 2012-04-08T03:36:50.423 に答える