Autofac DI并行。foreach

时间:2016-09-03 21:27:28

标签: c# entity-framework dependency-injection autofac parallel.foreach

我试图将autofac与并行foreach一起使用。我在并行foreach中创建了一个新的Lifetime范围。但是当我从foreach中访问一个注入的EF存储库时,它会抛出一个未设置为对象异常实例的对象。

using (var scope = container.BeginLifetimeScope())
{
    Parallel.ForEach(items, item =>
    {
         using (var parallelScope = scope.BeginLifetimeScope())
         {
             var aDataService = parallelScope.Resolve<IaDataService>();
             someProcessing(aDataService);
         }
     }
}

1 个答案:

答案 0 :(得分:1)

应用程序代码不应该知道创建范围和必须处理并行化。所以Parallel.ForEach应该是你的组合根的一部分,所以应该是对BeginLifetimeScope的任何调用。除此之外,不要使用生命周期范围作为在新线程中创建新范围的父范围;新线程是一个新的上下文,应该直接从容器创建范围。

所以这是代码应该是你的作文根的一部分:

Parallel.ForEach(items, item =>
{
     // Note I'm calling container.BeginLifetimeScope() inside the ForEach
     using (var parallelScope = container.BeginLifetimeScope())
     {
         var aDataService = parallelScope.Resolve<IaDataService>();
         aDataService.SomeProcessing();
     }
 }