IoCコンテナとしてSimpleInjectorを使用しています。SimpleInjectorは、この単純な手法を使用して、スレッドごととWeb要求ごとの混合ライフスタイルを処理します
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を使用して、最初のスレッドのみがHttpContextで値を検出するため、Repositoryクラスの複数のインスタンスを並列に呼び出そうとすると問題が発生します。現在
using (TransactionScope scope = new TransactionScope())
{
Parallel.ForEach(new List<IRepository>() { _repository1, _repository2 ... },
(repository) =>
{
repository.Commit();
});
scope.Complete();
}
質問を書き終えたので、おそらく不可能か何か愚かなことを求めていることがわかります...しかし、一体何が...これはできるのでしょうか?単一のリクエスト/スレッド登録を複数の内部スレッドで利用できるようにすることはできますか?