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 означает, что вам нужно каждый раз создавать новый экземпляр службы с использованием фабрики (см. расширение фабрики). Таким образом, вы можете иметь контекст в области запроса.

Другие вопросы по тегам