InRequestScope располагает контекста объекта для DelegatingHandlers
Когда я связываю свой контекст как InRequestScope
контекст удаляется, когда вызывается код в DelegatingHandler (создается в Application_Start и выполняется до инициализации контроллеров). Если я использую InTransientScope, то он работает, но я хочу 1 контекст для всего. Основываясь на этом ответе здесь, это правильный способ иметь 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?
1 ответ
Использование временного или одноэлементного контекста области для вашего обработчика сообщений дает вам ограничение, что все сущности будут кэшироваться для обработчика сообщений. Например, если объект изменен / удален или добавлен новый объект, ваш обработчик сообщений никогда не адаптируется к этому изменению. Это может быть хорошо в некоторых случаях, когда данные никогда не меняются.
Если вам нужно работать с новейшими данными, которые будут меняться, вы не сможете использовать эти области. Но InRequestScope
означает, что вам нужно каждый раз создавать новый экземпляр службы с использованием фабрики (см. расширение фабрики). Таким образом, вы можете иметь контекст в области запроса.