Существует нет способа получить OwinContext.Get<T>
, чтобы решить проблемы с Autofac. Если вы погружаетесь в Microsoft.Owin.OwinContext.Get в Reflector, вы увидите, что он полностью поддерживается словарем вещей, которые вы регистрируете в среде. Это не динамика, и нет способа (без создания вашей собственной реализации IOwinContext
), чтобы заставить ее разрешить вещи либо из словаря , либо из-за зависимости.
Если вы находитесь в DelegatingHandler
или ApiController
вы будете иметь ссылку на текущий HttpRequestMessage
. Используйте message.GetDependencyScope()
, чтобы получить текущую область зависимости уровня запроса для разрешения служб.
public HttpResponseMessage SomeControllerAction()
{
var service = this.Request.GetDependencyScope().GetService(typeof(Service));
}
Если у вас есть доступ к HttpConfiguration
, то вы можете использовать HttpConfiguration.DependencyResolver
, чтобы разрешить ситуацию. Обратите внимание, что resolver будет не иметь зависимых от запроса запросов. Web API отслеживает область зависимостей запроса с входящим HttpRequestMessage
, поэтому имейте в виду это ограничение. There is an FAQ about per-request lifetime scope, который поможет вам в этом.
Если вы находитесь в месте, где есть только в IOwinContext
, вам, возможно, придется использовать пакет как CommonServiceLocator и associated Autofac.Extras.CommonServiceLocator. На самом деле нет способа получить ссылку на текущий HttpConfiguration
или глобальный контейнер только с IOwinContext
. Опять же, если вы пройдете этот маршрут, у вас не будет доступных зависимостей за запрос, поэтому имейте в виду.
Не работает, если ключ 'autofac: OwinLifetimeScope' имеет большое руководство позади него. Вместо этого используйте 'owinContext.GetAutofacLifetimeScope()'. –
У моего ключа также есть направляющая за ним - знаете ли вы, почему? – aup