2017-08-16 1 views
3

Dans une configuration Autofac: J'ai enregistré une dépendance à .InstancePerRequest() et une partie de mon code utilise le mot-clé async ou .continueWith(). Ma question est: si la dépendance est utilisée dans une continuation qui est exécutée de manière asynchrone, la dépendance sera-t-elle seulement éliminée une fois que le code asynchrone a été exécuté ou pourrait-il arriver avant?Une dépendance enregistrée comme .InstancePerRequest() dans autofac est-elle toujours disponible dans une continuation asynchrone?

scénario spécifique:

 // in IocConfig.cs 
    ContainerBuilder.Register(c => Context.CreateFromToken(                  
     c.Resolve<IUser>().Name,                              
     .As<Context>() 
     .InstancePerRequest(); 

Puis dans un fichier que j'ai ce code:

// elsewhere in the code for a specific request.. 
    client.PostAsync(new Uri(_context.GetSetting("SomeEndpoint")),requestContent) 
    .ContinueWith(task => 
     { 
      ErrorLog.Write(_context.CreateErrorEntry($"Request: sent {task.Result.StatusCode} result: {task.Result.ToJson()}", LogLevel.Debug)); 
     }); 

Est-ce que le _context ici (qui est .InstancePerRequest()) est toujours disponible dans le .ContinueWith(), ou peut-il être disposé?

Répondre

1

Si le même HttpContext (dans MVC) ou entrant RequestMessage (dans l'API Web) est disponible dans la continuation, alors l'élément per-request sera là. L'étendue de la durée de vie de la requête est stockée dans ces zones respectives.

S'il n'est pas disponible (par exemple, si votre système d'attente ne propage pas le contexte d'exécution complet), l'étendue de la durée de vie de la requête sera potentiellement éliminée et ne sera pas disponible.