I have ASP.NET MVC application where I registered a component with an InstancePerHttpRequest scope.
builder.RegisterType().As().InstancePerHttpRequest();
then I have an async piece of code where I'm resolving the Adapter component.
The following code is simplified
Task t = Request.Content.ReadAsMultipartAsync(provider).ContinueWith(t =>
// IHandleCommand takes an IAdapter as contructor argument
var h = DependencyResolver.Current.GetServices>();
);
The code above is throwing an exception: The request lifetime scope cannot be created because the HttpContext is not available.
So I did some research on the subject and found this answer
https://stackoverflow.com/a/8663021/1003222
Then I adjusted the resolving code to this
using (var c= AutofacDependencyResolver.Current.ApplicationContainer.BeginLifetimeScope(x => x.RegisterType().As).InstancePerLifetimeScope()))
{
var h = DependencyResolver.Current.GetServices>();
}
But the exception stayed the same. The request lifetime scope cannot be created because the HttpContext is not available.
Am I missing something ?
解决方案
Autofac tries to resolve the container from the MVC Dependency Resolver,
If you have a async operation the httpContext won't be available so DependencyResolver won't be available either.
One option in to make the container available in a static variable or a proper instance, and create a context scope for this operation.
public static IContainer Container
once you have the builder setup, copy the container
public class ContainerConfig
{
public static IContainer Container;
public static void RegisterComponents()
{
var builder = new ContainerBuilder();
builder.RegisterInstance(new Svc()).As();
Container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(Container ));
}
}
then when resolving use the static container config to create the instance you need.
using (var scope = ContainerConfig.Container.BeginLifetimeScope())
{
result = ContainerConfig.Container.Resolve();
}
hope it helps