我使用 Simple Injector 作为我的 IoC 容器。SimpleInjector 使用这种简单的技术来处理 Per Thread 和 Per Web Request 的混合生活方式
container.RegisterPerWebRequest<IWebRepository, Repository>();
container.RegisterLifetimeScope<IThreadRepository, Repository>();
container.Register<IRepository>(container.GetInstance<Repository>());
// Register as hybrid PerWebRequest / PerLifetimeScope.
container.Register<Repository>(() =>
{
Repository repository;
if (HttpContext.Current != null)
repository = (Repository)container.GetInstance<IWebRepository>();
else
repository = (Repository)container.GetInstance<IThreadRepository>();
return repository;
});
不幸的是(显然!),在我的 UnitOfWork 类的其他地方,当我使用 Parallel.ForEach 并尝试并行调用 Repository 类的多个实例时,这给了我一个问题,因为只有第一个线程在 HttpContext 中找到了一个值。当前的
using (TransactionScope scope = new TransactionScope())
{
Parallel.ForEach(new List<IRepository>() { _repository1, _repository2 ... },
(repository) =>
{
repository.Commit();
});
scope.Complete();
}
既然我已经写完我可以看到的问题,我可能会要求不可能或愚蠢的东西......但是到底是什么......可以做到吗?单个请求/线程注册是否可用于多个内部线程?