コンテキストを としてバインドすると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 内の他のすべてのコンテキスト?