web-dev-qa-db-fra.com

Comment accéder à IConfigurationRoot au démarrage sur .net core 2?

J'ai écrit un ConfigurationProvider personnalisé avec le framework d'entité. Étant donné que je souhaite également le mettre à jour pendant l'exécution, j'ai créé un IWritableableOption .

J'ai besoin de rafraîchir la configuration après la mise à jour. Cela peut être fait via IConfigurationRoot.Reload .

Cependant, comment puis-je obtenir le IConfigurationRoot dans .net core 2?

Ce que j'ai trouvé, c'est que dans les versions précédentes, le IConfigurationRoot faisait partie du démarrage. Dans .net core 2 cependant, nous n'avons que le type plus simple IConfiguration:

public Startup(IConfiguration configuration)
{
    // I tried to change this to IConfigurationRoot,
    // but this results in an unresolved dependency error
    Configuration = configuration;
}

public IConfiguration Configuration { get; }

J'ai également découvert que je peux obtenir ma propre instance en utilisant

WebHost.CreateDefaultBuilder(args).ConfigureAppConfiguration(context, builder) => {
    var configurationRoot = builder.build()
})

Mais je veux mettre à jour la configuration utilisée par Startup.

Alors, comment puis-je obtenir le IConfigurationRoot utilisé par Startup pour l'injecter dans ma collection de services?

9
Christian Gollhardt

Merci à Dealdiane's commentaire.

On peut abattre le IConfiguration:

public Startup(IConfiguration configuration)
{
    Configuration = (IConfigurationRoot)configuration;
}

public IConfigurationRoot Configuration { get; }

Je ne suis toujours pas sûr, si c'est le chemin prévu, car IConfiguration ne fait aucune garantie sur IConfigurationRoot.

14
Christian Gollhardt

Ou vous pouvez l'injecter avant l'initialisation du Startup:

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args)
    {
        IConfigurationRoot configurationRoot = null;
        return WebHost.CreateDefaultBuilder(args)
                 .ConfigureAppConfiguration((context, builder) =>
                  {
                      configurationRoot = builder.Build();
                  })
                  .ConfigureServices(services =>
                  {
                      services.AddSingleton<IConfigurationRoot>(configurationRoot);
                      services.AddSingleton<IConfiguration>(configurationRoot);
                  })
                 .UseStartup<Startup>();
    }
}
1
VahidN