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();
}
}
我正在尝试将 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();
}
}