2017-05-15 2 views
1

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

+0

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

Répondre

1

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 
}