Uso il Simple Injector come contenitore IoC. SimpleInjector utilizza this simple technique to handle mixed life style for Per Thread and Per Web RequestUso delle dipendenze su più thread con Parallel.ForEach
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;
});
Purtroppo (e, ovviamente!), Altrove nella mia classe UnitOfWork questo mi sta dando un problema quando uso Parallel.ForEach e cerco di mettere in più istanze della classe Repository in parallelo, come solo la prima dei fili rileva un valore in HttpContext.Current
using (TransactionScope scope = new TransactionScope())
{
Parallel.ForEach(new List<IRepository>() { _repository1, _repository2 ... },
(repository) =>
{
repository.Commit();
});
scope.Complete();
}
Ora che ho finito di scrivere la domanda posso vedere che sto probabilmente chiedere l'impossibile o qualcosa di stupido ... ma che diavolo. .. Può essere fatto? È possibile rendere disponibile una singola richiesta/registrazione di thread a più thread interni?