在单独的线程中使用实例时,应使用哪个生存期范围?

时间:2018-12-21 21:14:32

标签: c# asp.net-web-api autofac

我有一个WebApi项目,并且在控制器中,我正在使用HostingEnvironment.QueueBackgroundWorkItem在单独的线程中开始工作:

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

    return Ok();
}

当前,在上面的示例中,我正在使用我的service的一个具体实例(我要替换)。我还使用Autofac,并且为我的服务配置如下:

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

在请求中正常使用时,上述注册适用于所有服务。

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

2 个答案:

答案 0 :(得分:0)

  

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

是的,注册配置将起作用。

无论您在服务中调用哪种方法,都可能会行不通:

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等)。

答案 1 :(得分:0)

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