2017-08-15 2 views
0

J'ai parcouru la majeure partie de la documentation et je ne suis toujours pas sûr de l'utilisation spécifique des étendues de dépendance. Lorsque ma requête touche mon contrôleur, je peux généralement utiliser les dépendances du contrôleur (fournies via l'injection constructeur) et ne pas m'en soucier beaucoup.Utilisation des étendues Autofac dans WebApi2

Cependant, je suis en train d'écrire un Delegating Handler:

public class MyHandler: DelegatingHandler 
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, 
     CancellationToken cancellationToken) 
    { 
     // I need IMyService here 
     return await base.SendAsync(request, cancellationToken); 
    } 

J'ai d'abord essayé de le faire:

using(var scope = request.GetDependencyScope()){ 
    var service = scope.GetService(typeof(IMyService)); 
} 

Mais que - tout cela fonctionne - semble fermer la portée et empêcher mon contrôleur de même initialisation correctement.

que je pouvais faire:

{ 
     var requestScope = request.GetDependencyScope(); 
     var scope = requestScope.GetRequestLifetimeScope(); 

     var service = scope.Resolve<IMyService>(); 
     // use service 
     return await base.SendAsync(request, cancellationToken); 
} 

mais qui sera crée pas de fuite de ressources? Est-ce que le RequestLifetimeScope sera éliminé lorsque la demande sera terminée?

Si vous pouviez me fournir un échantillon de DelegatingHandler de base de bonnes pratiques et de bonnes pratiques en utilisant le service Autofac-resolved, cela m'aiderait énormément.

Répondre

1

La portée de dépendance au niveau de la demande est créée pour vous et éliminée pour vous. Il suffit de l'obtenir (pas à l'intérieur d'un using) et résoudre le problème si nécessaire. Bien sûr, assurez-vous que le middleware Autofac exécute avant votre middleware afin que la portée puisse être créée pour vous; et si c'est le cas, il va nettoyer après vous aussi. Automatiquement

+0

J'ai essayé le code "I could do" et cela semble fonctionner correctement. Si je vous comprends bien, c'est la bonne façon de résoudre mon service? – Gerino

+1

Je voudrais juste GetDependencyScope et résoudre à partir de là, mais oui, si vous devez faire l'emplacement de service au lieu de DI, c'est ainsi. Notez que ce n'est pas spécifique à Autofac - c'est ainsi que fonctionne l'API Web. –