2017-07-24 2 views
0

J'ai un projet ASP.NET Core. Je veux résoudre dynamiquement une dépendance "une instance par requête" dans mes autres dépendances.Comment résoudre dynamiquement la dépendance InstancePerLifetimeScope dans ASP.NET Core?

Je me suis inscrit une dépendance à l'aide Autofac comme une dépendance InstancePerLifetimeScope dans ma classe de démarrage:

public IServiceProvider ConfigureServices(IServiceCollection services) 
{ 
    var builder = new ContainerBuilder(); 
    builder.RegisterType<MyDependency>().AsImplementedInterfaces().InstancePerLifetimeScope(); 
    return new AutofacServiceProvider(builder.Build()); 
} 

Lorsque j'utilise cette dépendance directement dans le constructeur du contrôleur, il fonctionne comme prévu - il est une nouvelle instance par requête. :

public MyController(IMyDependency dependency) 
{ 
} 

Je veux réaliser la même chose dans l'une des classes dépendantes. La dépendance est dynamique, donc je veux résoudre ce IServiceProvider de:

public class MyDeepDeepDependency 
{ 
    public MyDeepDeepDependency(IServiceProvider serviceProvider) 
    { 
     var dep = serviceProvider.GetService(typeof(IMyDependency)); 
    } 
} 

Cependant, une instance « dep » est le même pour toutes les demandes.
Je suppose qu'il y a une nouvelle portée créée par requête, et le contrôleur est résolu à partir d'une nouvelle portée. Lors de la résolution de IServiceProvider, je reçois toujours un IServiceProvider racine au lieu d'une demande.

Existe-t-il un moyen de résoudre IServiceProvider spécifique à une demande? Je pense que c'est la même chose que HttpContext.RequestServices dans le contrôleur, mais je ne veux pas passer la référence à travers toutes mes classes.

Existe-t-il un autre moyen de résoudre une dépendance dynamique une fois par requête?

Répondre

0

Je fini par injection IHttpContextAccessor:

public class MyDeepDeepDependency 
{ 
    public MyDeepDeepDependency(IHttpContextAccessor contextAccessor) 
    { 
     var dep = contextAccessor.HttpContext.RequestServices.GetService(typeof(IMyDependency)); 
    } 
}