Je souhaite utiliser dryioc pour gérer les dépendances requises par plusieurs threads. Je veux démarrer des threads en passant un travail qui nécessite que les dépendances soient résolues par ioc. Je ne sais pas à quoi cela devrait ressembler idéalement toute aide appréciée.Dryioc et plusieurs threads
Répondre
Si vous avez besoin d'scope à un fil (une seule instance par thread), puis définissez ThreadScopeContext
pour conteneur:
RootContainer = new Container(scopeContext: new ThreadScopeContext());
RootContainer.Register<IService, MyService>(Reuse.InCurrentScope);
// in your thread
using (RootContainer.OpenScope())
{
var service = RootContainer.Resolve<IService>();
// use the service
}
Si vous avez besoin d'commencer en direct dans le nouveau fil, mais propager la même instance par async/await
appels (éventuellement sur des threads différents), utilisez AsyncExecutionFlowScopeContext
.
Le contexte d'étendue dans DryIoc est un objet tiers, indépendant du conteneur, où vous pouvez stocker des étendues ouvertes, par ex. dans le fil statique, ou AsyncLocal
variable.
Une autre façon (le comportement par défaut) est d'associer une portée ouverte à nouveau conteneur sectorisé, mais vous avez besoin de la référence à ce nouveau conteneur pour pouvoir le résoudre. Ici, je ne suis pas en utilisant un contexte de portée, mais il faut résoudre de scopedContainer
au lieu de la racine un:
RootContainer = new Container(); // without ambient scope context
RootContainer.Register<IService, MyService>(Reuse.InCurrentScope);
// in your thread
using (var scopedContainer = RootContainer.OpenScope())
{
var service = scopedContainer.Resolve<IService>();
// use the service
}
De la [wiki DryIoc] (https://bitbucket.org/dadhi/dryioc/overview): _Thread- sûr et sans verrou - les inscriptions et les résolutions peuvent se dérouler en parallèle sans corrompre l'état du conteneur. _ - Si la déclaration est vraie, vous devriez pouvoir injecter librement des dépendances depuis n'importe quel thread sans aucun souci. Bonne chance! – BlueStrat