我试图将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);
}
}
}
答案 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();
}
}