C# 解析Autofac SingleInstance仍然会导致;无法创建请求生存期范围,因为HttpContext不可用;例外

C# 解析Autofac SingleInstance仍然会导致;无法创建请求生存期范围,因为HttpContext不可用;例外,c#,asp.net-mvc,dependency-injection,asp.net-mvc-5,autofac,C#,Asp.net Mvc,Dependency Injection,Asp.net Mvc 5,Autofac,注意:我已经读过这篇文章,它不是重复的 在最近的更新中,我为AutoMapper注册了一个Autofac模块: protected override void Load(A.ContainerBuilder builder) { var mapper = this.Config.CreateMapper(); builder.RegisterInstance(this.Config).As<IConfigurationProvider>().SingleInstan

注意:我已经读过这篇文章,它不是重复的

在最近的更新中,我为AutoMapper注册了一个Autofac模块:

protected override void Load(A.ContainerBuilder builder)
{
    var mapper = this.Config.CreateMapper();

    builder.RegisterInstance(this.Config).As<IConfigurationProvider>().SingleInstance();
    builder.RegisterInstance(mapper).SingleInstance();
}
以下是定义:

public class BaseController : Controller
{
    public IConfigurationProvider MapperConfig
    {
        get
        {
            return this.Service<IConfigurationProvider>();
        }
    }
}

public static class ControllerExtension
{

    public static T Service<T>(this Controller controller) where T : class
    {
        return DependencyUtils.Resolve<T>();
    }

}

public static class DependencyUtils
{

    public static T Resolve<T>() where T : class
    {
        return DependencyResolver.Current.GetService<T>();
    }

}
以及
服务
方法:

    public static T Service<T>(this Controller controller) where T : class
    {
        return DependencyResolver.Current.GetService<T>();
    }
我做错了什么

编辑:我将电话分开,这样可以更清楚:

    var mapperConfig = this.MapperConfig;
    var modelProducts = await service.GetActive()
        .ProjectTo<ProductViewModel>(mapperConfig)
        .ToListAsync();
    model.AppendLine("Select new products and project into ViewModel async successfully:");
var mapperConfig=this.mapperConfig;
var modelProducts=await service.GetActive()
.ProjectTo(mapperConfig)
.ToListAsync();
AppendLine(“选择新产品并成功地将项目导入ViewModel异步:”);

异常发生在第一行,
var mapperConfig=this.mapperConfig
,它与服务调用无关。

无论
依赖解析程序是否工作。当前的
工作正常,都需要有一个请求生存期,这就是在解析程序上调用
GetService
时。很难判断您正在运行的代码是否在控制器中(如果是,是哪种代码?)以及调用的顺序。如果您在控制器操作中,请在操作中尝试右键调用
dependencysolver.Current.GetService()
,而不使用所有额外的间接寻址。它有用吗?@TravisIllig你是对的。在控制器操作中直接调用该行是有效的。我不知道为什么调用属性时的
HttpContext
null
。我会相应地更新问题。@TravisIllig我已经为新代码更新了问题。我真的不明白,流是同步的,但为什么HttpContext突然消失了?我在调试器中使用了标记对象Id,
DependencyResolver。工作调用和非工作调用中当前的
都是同一个对象。因此,要清楚,如果将这两行(直接调用
dependencysolver.Current.GetService
的行和调用
this.MapperConfig
的行)放在代码中,则
dependencysolver
行成功,而
MapperConfig
行失败?@TravisIllig Ok,我想我发现了问题所在。这不是依赖性错误。我不知道为什么在一个
await
操作符之后,我的HttpContext为null。如果我把两条线都移到顶部,效果很好!所以,是的,上次我检查时,我没有将这两行放在一起,我的错。无论
dependencysolver.Current
是否工作,都需要有一个请求生存期,这是当您在解析器上调用
GetService
时。很难判断您正在运行的代码是否在控制器中(如果是,是哪种代码?)以及调用的顺序。如果您在控制器操作中,请在操作中尝试右键调用
dependencysolver.Current.GetService()
,而不使用所有额外的间接寻址。它有用吗?@TravisIllig你是对的。在控制器操作中直接调用该行是有效的。我不知道为什么调用属性时的
HttpContext
null
。我会相应地更新问题。@TravisIllig我已经为新代码更新了问题。我真的不明白,流是同步的,但为什么HttpContext突然消失了?我在调试器中使用了标记对象Id,
DependencyResolver。工作调用和非工作调用中当前的
都是同一个对象。因此,要清楚,如果将这两行(直接调用
dependencysolver.Current.GetService
的行和调用
this.MapperConfig
的行)放在代码中,则
dependencysolver
行成功,而
MapperConfig
行失败?@TravisIllig Ok,我想我发现了问题所在。这不是依赖性错误。我不知道为什么在一个
await
操作符之后,我的HttpContext为null。如果我把两条线都移到顶部,效果很好!所以,是的,上次我检查时,我没有把这两条线放在一起,我的错。
    var modelProducts = await service.GetActive()
        .ProjectTo<ProductViewModel>(this.MapperConfig)
        .ToListAsync();
    model.AppendLine("Select new products and project into ViewModel async successfully:");
public MapperConfiguration MapperConfig
{
    get
    {
        return this.Service<MapperConfiguration>();
    }
}
    public static T Service<T>(this Controller controller) where T : class
    {
        return DependencyResolver.Current.GetService<T>();
    }
    var model = new StringBuilder();

    var service = this.Service<IProductService>();
    model.AppendLine("Service resolved successfully");

    var products = service.Get().ToList();
    model.AppendLine("Get all products successfully");

    products = await service.Get().ToListAsync();
    model.AppendLine("Get all products async successfully");
    var mapperConfig = this.MapperConfig;
    var modelProducts = await service.GetActive()
        .ProjectTo<ProductViewModel>(mapperConfig)
        .ToListAsync();
    model.AppendLine("Select new products and project into ViewModel async successfully:");