Est-il possible de résoudre une instance de à IOptions<AppSettings>
partir de la ConfigureServices
méthode dans Startup? Normalement, vous pouvez utiliser IServiceProvider
pour initialiser des instances, mais vous ne l'avez pas à ce stade lorsque vous enregistrez des services.
public void ConfigureServices(IServiceCollection services)
{
services.Configure<AppSettings>(
configuration.GetConfigurationSection(nameof(AppSettings)));
// How can I resolve IOptions<AppSettings> here?
}
c#
asp.net-core
inversion-of-control
asp.net-core-mvc
Muhammad Rehan Saeed
la source
la source
ConfigureServices
méthode.BuildServiceProvider
provoque un avertissement si elle est utilisée dans le code d'application, par exemple,ConfigureServices
car cela entraîne une copie supplémentaire des services singleton. établi. La réponse d'Ehsan Mirsaeedi ici est la solution la plus idéale pour des cas comme celui-ci.La meilleure façon d'instancier des classes qui dépendent d'autres services consiste à utiliser la surcharge Add XXX qui vous fournit IServiceProvider . De cette façon, vous n'avez pas besoin d'instancier un fournisseur de services intermédiaire.
Les exemples suivants montrent comment vous pouvez utiliser cette surcharge dans les méthodes AddSingleton / AddTransient .
la source
Le moyen le plus simple et le plus correct d'y parvenir, dans toutes les versions d'ASP.NET Core , consiste à implémenter l'
IConfigureOptions<TOptions>
interface. Bien que cela existe depuis .NET Core 1.0, il semble que peu de gens sachent comment les choses fonctionnent Just Work ™ .Par exemple, vous souhaitez ajouter un validateur de modèle personnalisé qui a une dépendance sur l'un des autres services de votre application. Au départ, cela semble impossible - il n'y a aucun moyen de résoudre
IMyServiceDependency
car vous n'avez pas accès à unIServiceProvider
:Mais la "magie" du
IConfigureOptions<TOptions>
rend les choses si faciles:Essentiellement, toute configuration que vous auriez effectuée dans les
Add***(***Options)
déléguésConfigureServices
est maintenant déplacée versIConfigureOptions<TOptions>
laConfigure
méthode de votre classe . Ensuite, vous enregistrez les options de la même manière que vous enregistrez n'importe quel autre service, et c'est parti!Pour plus de détails, ainsi que des informations sur la façon dont cela fonctionne dans les coulisses, je vous renvoie au toujours excellent Andrew Lock .
la source
Cherchez-vous quelque chose comme suivre? Vous pouvez jeter un oeil à mes commentaires dans le code:
la source
Vous voulez aider les autres qui ressemblent à la même chose, mais qui utilisent également Autofac.
Si vous voulez obtenir ILifetimeScope (c'est-à-dire le conteneur de la portée actuelle), vous devez appeler la
app.ApplicationServices.GetAutofacRoot()
méthodeConfigure(IApplicationBuilder app)
qui renverra l'instance ILifetimeScope que vous pouvez utiliser pour résoudre les servicesla source