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
).
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;
// ...
}
// ...
}
À 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; }
...
}
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;"
}
}