ASP .Net 4 Web Api RC + Autofac ручное разрешение
Я пытаюсь использовать средство определения зависимостей внутри метода Web Api. Это работало нормально и отлично работает с классическим ASP.NET MVC с DepedencyResolver.GetService()
Но я не могу заставить это работать внутри методов WepApi.
Моя регистрация регистрирует все экземпляры как InstancePerApiRequest, и если я добавляю любой из всех типов, которые я зарегистрировал в моем загрузчике, в конструктор моего WebAPiConroller, то это нормально, но больше не при вызове их внутри.
Как это в моем методе Get Get
var userRepository = (IUserRepositoryu)GlobalConfiguration
.Configuration.DependencyResolver.GetService(typeof(IUserRepository));
Я получил ошибку WebRequest без области действия. Странно то, что в бета-версии все работало нормально, пока они не изменили все на GlobalConfiguration.
Итак, мой вопрос, как я могу активировать свои зарегистрированные сборки Autofac в области действия моего webAPi, как и раньше?
Моя ошибка:
"Из области, в которой был запрошен экземпляр, не видна область с тегом, совпадающим с" AutofacWebRequest ". Это обычно указывает на то, что компонент, зарегистрированный как запрос на HTTP, запрашивается компонентом SingleInstance() (или аналогичным сценарием). При веб-интеграции всегда запрашивайте зависимости из DependencyResolver.Current или ILifetimeScopeProvider.RequestLifetime, а не из самого контейнера."
var resolver = new AutofacWebApiDependencyResolver(container);
configuration.DependencyResolver = resolver;
3 ответа
В веб-API средство разрешения глобальных зависимостей используется для доступа к глобальным экземплярам. Службы по запросу поступают из области зависимостей, которую Web API создает для обработки запроса. Я не уверен, что в Web API есть какой-либо способ доступа к текущей области зависимостей - было бы интересно узнать.
Лучший вариант здесь - просто использовать внедрение зависимостей, а не вызывать распознаватель напрямую, как это. Какая часть вашего кода должна сделать этот вызов?
Как указано в сообщении об ошибке, вы всегда должны запрашивать зависимости из DependencyResolver.Current или ILifetimeScopeProvider.RequestLifetime. Правильный способ получения зависимости от текущего веб-запроса API:
// Get the request lifetime scope so you can resolve services.
var requestScope = Request.GetDependencyScope();
// Resolve the service you want to use.
var userRepository = requestScope.GetService(typeof(IUserRepository)) as IUserRepository;
Подробнее смотрите в официальной документации Autofac: http://docs.autofac.org/en/latest/integration/webapi.html
AutoFac имеет интеграцию с ASP.NET WebAPI, чтобы использовать его.
Кроме того, средство определения зависимостей для WebAPi немного отличается от ASP.NET MVC, поэтому убедитесь, что вы реализовали средство преобразования, подходящее для WebAPI, и добавили его в конфигурацию WebAPI.
http://www.asp.net/web-api/overview/extensibility/using-the-web-api-dependency-resolver