0

Я пытаюсь получить экземпляр из контейнера в ActionFilter.OnActionExecuted. Зависимость зарегистрирована в Lifestyle.Scoped в веб-api. После отладки проблемы я вижу, что экземпляр, возвращаемый в фильтре, отличается от экземпляра, возвращаемого во время запроса (например, впрыскивается в контроллеры)Когда закончится область WebApiRequestLifestyle?

Может кто-нибудь объяснить, что именно представляет собой начало и конец стиля жизни в Интернете? объем?

ответ

1

Возможности для WebApiRequestLifestyle создается в тот момент, когда Web API вызывает IDependencyResolver.BeginScope() и заканчивается, когда он вызывает Dispose() на возвращенном IDependencyScope экземпляра.

В прошлом я заметил несколько действительно странных причуд в дизайне веб-интерфейсов, которые связаны с охватом и асинхронностью. Например, Web API вызывает IDependencyScope.Dispose() после того, как поток async уже завершен. Это означает, что во время вызова IDependencyScope.Dispose() любые данные, хранящиеся в начале запроса с использованием CallContext.SetLogicalData, больше не могут быть получены в этот момент времени. Таким образом, существует разрыв между окончанием запроса и удалением сферы действия. Простой инжектор зависит от наличия CallContext во время запроса на удаление экземпляров с областью.

Что может случиться, так это то, что веб-API вызывает ваш OnActionExecuted во время этого разрыва. Лишь немногие разработчики когда-либо замечают эту причуду, так как обычно во время разрыва все зависимости уже разрешены. Однако, если вы разрешаете услуги на этом этапе, все происходит неправильно в веб-API.

 Смежные вопросы

  • Нет связанных вопросов^_^