Короткий вопрос: То же, что и эта неотвеченная проблема
Долгосрочный вопрос:
Я просто портировал некоторый код из решения MVC 4 + Web Api, которое использовало Autofac в моем новом решении, которое также использует Autofac, но только с Web Api 2 (без проекта MVC 5.1, просто веб-api).
В моем предыдущем решении у меня были MVC4 и Web Api, поэтому у меня было 2 файла Bootstrapper.cs, по одному для каждого. Я скопировал только загрузочный скрипт Web Api для нового проекта.
Теперь у меня есть еще 2 проекта в новом решении, которое нужно вытащить зависимость. Давайте просто предположим, что я должен использовать DependencyResolver.Current.GetService<T>()
, несмотря на то, что это анти-шаблон.
Сначала это не работало, пока я не установил MVC Dependency Resolver в тот же контейнер:
GlobalConfiguration.Configuration.DependencyResolver =
new AutofacWebApiDependencyResolver(container);
//I had to pull in Autofac.Mvc and Mvc 5.1 integration but this line fixed it
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
Странная часть заключается в том, что она только фиксирует ее в ОДНОМ из этих проектов! Здесь ситуация:
Solution.Web project
Bootstrapper.cs that registers both dependency resolvers for web api and mvc.
Solution.ClassLib project
var userRepo = DependencyResolver.Current.GetService<IUserRepo>(); //Good! :)
Solution.WindowsWorkflow project
var userRepo = DependencyResolver.Current.GetService<IUserRepo>(); //Throws exception :(
Исключение составляет: Область действия запроса не может быть создана, потому что HttpContext недоступен.
Теперь, прежде чем мы начнем обвинять рабочий процесс, просто знаю, что у меня была эта точная настройка, работающая отлично в другом решении, рабочий процесс смог использовать DependencyResolver просто отлично. Поэтому я подозреваю, что это связано с использованием более новой версии Autofac и тем фактом, что рабочий процесс выполняется асинхронно (как и вопрос, связанный с асинхронным кодом)
Я попытался переключить весь регистрационный код на использование InstancePerLifetimeScope()
вместо InstancePerHttpRequest()
и попытаться создать область действия:
using (var c= AutofacDependencyResolver.Current
.ApplicationContainer.BeginLifetimeScope("AutofacWebRequest"))
{
var userRepo = DependencyResolver.Current.GetServices<IUserRepo>();
}
Но это не изменило исключение. Прерывая код еще ниже, точным виновником:
var adr = AutofacDependencyResolver.Current; //Throws that exception
На самом деле нужно пройти мимо этого, потратив слишком много времени. Наградит существующий ответ щедростью за 2 дня