Chaque fois que j'appelle Configuration.GetSection
, la propriété Value
de l'objet renvoyé est toujours null.
Mon constructeur Startup
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddEnvironmentVariables();
this.Configuration = builder.Build();
}
Ma méthode ConfigureServices
public void ConfigureServices(IServiceCollection services)
{
services.Configure<SqliteSettings>(opts => Configuration.GetSection("SqliteSettings").Bind(opts));
services.AddOptions();
services.AddMvc();
}
Mon appsettings.json
{
"SqliteSettings": {
"DataSource": "C:\\db.sqlite",
"NewDatabase": true,
"Version": 3
}
}
La classe que j'utilise pour définir SqliteSettings
public class SqliteSettings
{
public string DataSource { get; set; }
public bool? NewDatabase { get; set; }
public int? Version { get; set; }
public string Password { get; set; }
public long? CacheSize { get; set; }
// More properties
}
Je pensais que le JSON aurait peut-être besoin de la même quantité de propriétés, ou est-ce que cela a quelque chose à voir avec les définitions de type de données, mais celles-ci n'ont peut-être aucun lien.
Modifiez simplement votre méthode ConfigureServices
pour qu'elle ressemble à ce qui suit:
public void ConfigureServices(IServiceCollection services)
{
services.AddOptions();
services.Configure<SqliteSettings>(Configuration.GetSection("SqliteSettings"));
services.AddMvc();
}
et ça devrait marcher.
Selon le Microsoft Docs : "Lorsque GetSection renvoie une section correspondante, Value n'est pas renseignée. Une clé et un chemin sont renvoyés lorsque la section existe."
Si vous souhaitez voir les valeurs de cette section, vous devrez appeler la méthode GetChildren (): Configuration.GetSection("SqliteSettings").GetChildren();
Ou vous pouvez utiliser: Configuration.GetSection("SqliteSettings").Get<SqliteSettings>()
. JSON n'a pas besoin d'avoir le même nombre de propriétés pour correspondre. Les propriétés nullables sans correspondance seront définies sur null et les propriétés sans correspondance non nulles seront définies sur leur valeur par défaut (par exemple, int sera défini sur 0).
appsettings.json
et accédez à Propriétés.Cela a fonctionné pour moi dans une application console:
var connectionString = config["ConnectionStrings:DefaultConnection"]
var serviceProvider = services.BuildServiceProvider();
doit venir après tous les appels services.Configure
.
Dans le cas de Web Api Core 2.1, j'avais besoin de Program.cs
dans le dossier racine du projet (le même dossier que Startup.cs).