代码之家  ›  专栏  ›  技术社区  ›  Ivan-Mark Debono

在单独线程中使用实例时要使用哪个生存期作用域?

  •  3
  • Ivan-Mark Debono  · 技术社区  · 6 年前

    我有一个webapi项目,在我使用的控制器中 HostingEnvironment.QueueBackgroundWorkItem 要在单独的线程中启动作业,请执行以下操作:

    public IHttpActionResult DoJob()
    {
        HostingEnvironment.QueueBackgroundWorkItem(ct =>
        {
            var service = new MyService(logService, userInfo);
            var entity = service.DoJob(ct);
        });
    
        return Ok();
    }
    

    目前,在上面我正在使用我的服务的一个具体实例(我想替换它)。我也用 Autofac 对于我的服务,我配置如下:

    builder.RegisterAssemblyTypes(assemblies)
        .Where(t => t.Name.EndsWith("Service"))
        .AsImplementedInterfaces()
        .InstancePerRequest();
    

    当在请求内正常使用时,上述注册对所有服务都有效。

    当请求终止后在单独的线程中运行时,上述注册是否也适用于服务?

    2 回复  |  直到 6 年前
        1
  •  0
  •   Erik Philips    6 年前

    当请求终止后在单独的线程中运行时,上述注册是否也适用于服务?

    是的 配置 对于 注册 会工作。

    无论您在服务中调用的方法是否可行:

    What this means is that if you try to resolve components that are registered as instance-per-request but there’s no current request… you’re going to get an exception. .

    以下两种情况中的任何一种都是正确的。

    有时您可能会让autofac工作,因为请求仍然存在,但有时不会,因为请求结束。

    或者(很可能)

    执行 QueueBackgroundWorkItem() 不在生命周期范围内,所以根本不起作用。

    因此,最终您的服务应该创建自己的生命周期范围(idisposable等)。

        2
  •  0
  •   Susindar    6 年前

    依赖注入与线程无关,除非我们在应用程序/服务开始时错过了配置该线程的所有可访问成员的依赖注入。