parallel.foreach 中的 Autoface DI

Autofac DI in parallel.foreach

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

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

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

所以这是应该成为您的 Composition Root 一部分的代码:

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();
     }
 }