Comment résoudre Autofac InstancePerHttpRequest
J'ai enregistré un composant comme ça dans mon Global.asax.cs:
ContainerBuilder builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.RegisterType<WebWorkContext>().As<IWorkContext>().InstancePerHttpRequest();
IContainer container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
//This is where my error happens, not sure why?
var workContext = container.Resolve<IWorkContext>();
WebWorkContext
classe:
public class WebWorkContext : IWorkContext
{
//Left out other code
}
IWorkContext
interface:
public interface IWorkContext
{
//Left out other code
}
L'erreur que j'obtiens est:
Pas de portée avec une Étiquette correspondant à "httpRequest" est visible à partir de l'étendue dans laquelle l'instance a été demandé. Cela indique généralement qu'un composant inscrit en tant que par requête HTTP est reqested par une instance unique (des) composant (ou un scénario similaire.) En vertu de l'intégration web et toujours à la demande des dépendances de la DependencyResolver.Actuelles ou ILifetimeScopeProvider.RequestLifetime, jamais à partir du conteneur.
Comment puis-je obtenir que cela fonctionne? Ce pourquoi je veux de cette façon est parce que le contexte de travail, poignées de trucs comme l'obtention de la clientèle actuelle, etc.
Quelques questions supplémentaires. Est-il sage/les meilleures pratiques pour inscrire tous à la fois? L'scénarios que j'ai besoin d'ajouter plus de composants à une autre étape?
source d'informationauteur Brendan Vogt
Vous devez vous connecter pour publier un commentaire.
Enregistrements qui sont marqués avec
InstancePerHttpRequest
sont susceptibles d'être réglés à partir d'un certain imbriquée durée de vie étendue qui est créé et cédés au cours de chaque requête HTTP.Si vous ajoutez
IWorkContext
comme un paramètre de constructeur à l'un de vos contrôleurs, vous trouverez qu'une instance est injecté. Dans votre code, vous essayez de résoudre votre service à partir de la racine de la durée de vie de la portée et de ne pas imbriquée "par la demande" durée de vie étendue.Si vous voulez tester la résolution du service sans l'exécution de votre application, vous devez créer une vie portée avec la même étiquette que celle créée lors de la requête HTTP. Dans le MVC 3 l'intégration de la durée de vie de la portée est marqué "httpRequest".
Je pense que je vais mettre à jour le MVC intégration à exposer le "httpRequest" nom de la balise public par le biais de l'API, de sorte que les valeurs de chaîne n'a pas besoin d'être codé en dur. Il est également possible de transmettre votre propre
ILifetimeScopeProvider
mise en œuvre de laAutofacDependencyResolver
de sorte que vous pouvez contrôler la création de la durée de vie des étendues à l'extérieur de la ASP.NET moment de l'exécution. Ceci est utile pour les tests unitaires quand il n'ya pas de requête HTTP est disponible.Je fais cela dans WebForms: