当第一次通过async/await请求使用Ninject访问注入的对象时,HttpContext为null

本文关键字:对象 注入 访问 null HttpContext Ninject 第一次 async 请求 await | 更新日期: 2023-09-27 18:19:28

我在使用Task<ActionResult>方法向web服务器发出的第一个请求中遇到了一个极其隐蔽的错误。之后,服务器运行良好,不会发生崩溃。错误显示:

Value cannot be null. Parameter name: httpContext

它在第一条线上崩溃:

 public async Task<ActionResult> Index()
    {
        var account = await Data.Of<Account>()
            .AsQueryable(a => a.Id == WebSecurity.CurrentUserId,
                "AllowedReportTypes",
                "AllowedReports.Parameters.ParameterChoices",
                "AllowedReports.ReportType",
                "AllowedBusinesses")
            .FirstOrDefaultAsync();

其中Data是通过Ninject注入的IWorker接口,如下所示:

kernel.Bind(typeof (IWorker<>))
    .To(typeof (Worker<>))
    .When(x=> HttpContext.Current == null)
    .InThreadScope();
kernel.Bind(typeof (IWorker<>))
    .To(typeof (Worker<>))
    .When(x => HttpContext.Current != null)
    .InRequestScope();
GlobalConfiguration.Configuration.DependencyResolver = 
    new NinjectDependencyResolver(kernel);

只有当我使用async/await操作时才会出现此问题。当它们是同步的时,这个问题永远不会发生。

有人能告诉我为什么这个代码会在我的第一个请求而不是任何后续请求时崩溃吗?谢谢

当第一次通过async/await请求使用Ninject访问注入的对象时,HttpContext为null

我还没有时间更新这篇文章,但我已经解决了我的问题。不幸的是,我的应用程序的基础架构设计得很糟糕。

Ninject内核是通过我的用户界面项目引用的类库公开的。这意味着我必须对内核进行服务调用以解决依赖关系。例如,控制器继承了一个抽象类,该抽象类公开了属性Data,然后抽象类的声明中将包含以下内容:

public IWorker<DbContext> Data { get { return Kernel.Get(typeof(IWorker<DbContext>)); } }

不幸的是,这是一个反模式,这意味着Ninject并没有进行太多的依赖注入。我不得不重写整个项目(不幸的是,我还没有完成)。

用户界面项目现在是复合根。我可以通过引用Nuget中的Ninject.Web.Mvc快速做到这一点,Nuget在安装时创建了一个名为NinjectWebCommon的类,该类加载内核及其绑定,并在应用程序启动时将其设置为依赖解析程序。最困难的部分是重写我的所有控制器、视图、数据访问层和后端功能。。。哎哟