我有ASP.NETMVC应用程序,其中我用InstancePerHttpRequest
瞄准镜。
builder.RegisterType<Adapter>().As<IAdapter>().InstancePerHttpRequest();
然后,我有一段异步代码,在其中解析Adapter组件。
以下代码已简化
Task<HttpResponseMessage> t = Request.Content.ReadAsMultipartAsync(provider).ContinueWith(t =>
// IHandleCommand<T> takes an IAdapter as contructor argument
var h = DependencyResolver.Current.GetServices<IHandleCommand<T>>();
);
上面的代码抛出了一个异常:The request lifetime scope cannot be created because the HttpContext is not available.
然后,我将解析代码调整为
using (var c= AutofacDependencyResolver.Current.ApplicationContainer.BeginLifetimeScope(x => x.RegisterType<DataAccessAdapter>().As<IDataAccessAdapter>).InstancePerLifetimeScope()))
{
var h = DependencyResolver.Current.GetServices<IHandleCommand<T>>();
}
但例外情况保持不变。The request lifetime scope cannot be created because the HttpContext is not available.
解决方法:
Autofac试图从MVC依赖Resolver解析容器,如果您有异步操作,则httpContext将不可用,因此DependencyResolver也不可用。
其中一个选项可以使容器在静态变量或适当的实例中可用,并为此操作创建上下文范围。
public static IContainer Container
一旦安装了构建器,就复制容器。
public class ContainerConfig
{
public static IContainer Container;
public static void RegisterComponents()
{
var builder = new ContainerBuilder();
builder.RegisterInstance(new Svc()).As<ISvc>();
Container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(Container ));
}
}
然后,在解析时,使用静态容器配置来创建所需的实例。
using (var scope = ContainerConfig.Container.BeginLifetimeScope())
{
result = ContainerConfig.Container.Resolve<T>();
}