Short Question: Same as this unanswered problem
Long Question:
I just ported some code over from an MVC 4 + Web Api solution that was using Autofac into my new solution which is also using Autofac but only with Web Api 2 (no MVC 5.1 project, just a web api).
In my previous solution I had MVC4 and Web Api so I had 2 Bootstrapper.cs files, one for each. I copied over just the Web Api bootstrapper for the new project.
Now I have 2 other projects in the new solution that need to pull a dependency. Lets just assume I have to use DependencyResolver.Current.GetService<T>()
despite it being an anti-pattern.
At first this was not working until I set the MVC Dependency Resolver to the same container:
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));
The strange part is, doing that only fixed it in ONE of those projects! Here's the situation:
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 :(
The exception is: The request lifetime scope cannot be created because the HttpContext is not available.
Now before we start blaming the workflow, just know I had this exact set up working just fine in another solution the workflow was able to use DependencyResolver just fine. So I suspect this had to do with using a newer version of Autofac and the fact that the workflow runs asynchronously (just like the question i linked to regarding async code)
I tried switching all the registration code to use InstancePerLifetimeScope()
instead of InstancePerHttpRequest()
and trying to create a scope:
using (var c= AutofacDependencyResolver.Current
.ApplicationContainer.BeginLifetimeScope("AutofacWebRequest"))
{
var userRepo = DependencyResolver.Current.GetServices<IUserRepo>();
}
But it didnt change the exception. Breaking the code down even further here's the exact culprit:
var adr = AutofacDependencyResolver.Current; //Throws that exception
Really need to get past this spent too much time stuck. Will reward existing answer with bounty in 2 days
IUserRepo
directly from the container, without going to.Current
? AlsoInstancePerLifetimeScope()
is better thanInstancePerHttpRequest
. – Jacobite