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.
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
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. –