Comment résoudre Autofac InstancePerHttpRequest

J’ai enregistré un composant comme celui-ci dans mon fichier Global.asax.cs:

ContainerBuilder builder = new ContainerBuilder(); builder.RegisterControllers(Assembly.GetExecutingAssembly()); builder.RegisterType().As().InstancePerHttpRequest(); IContainer container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); // This is where my error happens, not sure why? var workContext = container.Resolve(); 

Classe WebWorkContext :

 public class WebWorkContext : IWorkContext { // Left out other code } 

Interface IWorkContext :

 public interface IWorkContext { // Left out other code } 

L’erreur que je reçois est la suivante:

Aucune étendue avec une balise correspondant à ‘httpRequest’ n’est visible à partir de l’étendue dans laquelle l’instance a été demandée. Cela indique généralement qu’un composant enregistré en tant que requête HTTP est ré-traité par un composant SingleInstance () (ou un scénario similaire). Sous l’intégration Web, demandez toujours des dépendances à DependencyResolver.Current ou ILifetimeScopeProvider.RequestLifetime, jamais à partir du conteneur lui-même. .

Comment puis-je obtenir que cela fonctionne? La raison pour laquelle je le veux de cette façon est que le contexte de travail gère des choses comme obtenir le client actuel, etc.

Quelques questions supplémentaires. Est-il sage / meilleures pratiques de s’inscrire chaque fois? Les scénarios seront-ils nécessaires pour append d’autres composants à une autre étape?

Les enregistrements marqués avec InstancePerHttpRequest devraient être résolus à partir d’une étendue de durée de vie nestede particulière créée et supprimée lors de chaque demande HTTP.

Si vous ajoutez IWorkContext tant que paramètre constructeur à l’un de vos contrôleurs, vous constaterez qu’une instance est injectée. Dans votre code, vous essayez de résoudre votre service à partir de la scope de la durée de vie racine et non de la scope de la durée de vie “par demande” nestede.

Si vous souhaitez tester la résolution du service sans exécuter votre application, vous devez créer une étendue de durée de vie avec la même balise que celle créée lors de la requête HTTP. Dans l’intégration de MVC 3, la scope de la durée de vie est étiquetée “httpRequest”.

 using (var httpRequestScope = container.BeginLifetimeScope("httpRequest")) { Assert.That(httpRequestScope.Resolve(), Is.Not.Null); } 

Je pense que je vais mettre à jour l’intégration MVC pour exposer le nom de la balise “httpRequest” publiquement via l’API afin que les valeurs de chaîne ne nécessitent pas d’être codées en dur. Il est également possible de passer votre propre implémentation ILifetimeScopeProvider à AutofacDependencyResolver afin que vous puissiez contrôler la création d’étendues de durée de vie en dehors du runtime ASP.NET. Ceci est utile dans les tests unitaires lorsqu’aucune requête HTTP n’est disponible.

Je le fais dans WebForms:

 this.RoutingService = ((Global)HttpContext.Current.ApplicationInstance).ContainerProvider.RequestLifetime.Resolve();