web-dev-qa-db-fra.com

Lire réellement AppSettings dans la phase ConfigureServices dans ASP.NET Core

J'ai besoin de configurer quelques dépendances (services) dans la méthode ConfigureServices dans une application Web ASP.NET Core 1.0.

Le problème est que, sur la base de la nouvelle configuration JSON, j'ai besoin d'installer un service ou un autre.

Je n'arrive pas à lire les paramètres dans la phase ConfigureServices de la durée de vie de l'application:

public void ConfigureServices(IServiceCollection services)
{
    var section = Configuration.GetSection("MySettings"); // this does not actually hold the settings
    services.Configure<MySettingsClass>(section); // this is a setup instruction, I can't actually get a MySettingsClass instance with the settings
    // ...
    // set up services
    services.AddSingleton(typeof(ISomething), typeof(ConcreteSomething));
}

J'aurais besoin de lire cette section et de décider quoi enregistrer pour ISomething (peut-être un type différent de ConcreteSomething).

18
Andrei Rînea

C'est ainsi que vous pouvez obtenir les paramètres saisis à partir de appSettings.json directement dans la méthode ConfigureServices:

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

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<MySettings>(Configuration.GetSection(nameof(MySettings)));
        services.AddSingleton(Configuration);

        // ...

        var settings = Configuration.GetSection(nameof(MySettings)).Get<MySettings>();
        int maxNumberOfSomething = settings.MaxNumberOfSomething;

        // ...
    }

    // ...
}
26
Dmitry Pavlov

À partir d'ASP.NET Core 2.0, nous effectuons la configuration dans la classe Program lors de la construction de l'instance WebHost. Exemple d'une telle configuration:

return new WebHostBuilder()
    .UseKestrel()
    .UseContentRoot(Directory.GetCurrentDirectory())
    .ConfigureAppConfiguration((builderContext, config) =>
    {
        IHostingEnvironment env = builderContext.HostingEnvironment;

        config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
    })

Entre autres, cela permet d'utiliser la configuration directement dans la classe Startup, d'obtenir une instance de IConfiguration via l'injection de constructeur (merci, conteneur DI intégré):

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

    public IConfiguration Configuration { get; }

    ...
}
9
Set

Vous pouvez accéder aux valeurs appsettings.json par Configuration["ConfigSection:ConfigValue"])

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

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<MyContext>(o => 
            o.UseSqlServer(Configuration["AppSettings:SqlConn"]));
    }
}

appsettings.json

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning",
      "System": "Information",
      "Microsoft": "Warning"
    }
  },
  "AppSettings": {
    "SqlConn": "Data Source=MyServer\\MyInstance;Initial Catalog=MyDb;User ID=sa;Password=password;Connect Timeout=15;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False;"
  }
}

0
Dave ت Maher