Je veux une classe statique simple qui accède à l'objet de configuration. Toutes les informations de configuration sont déjà extraites du fichier appsettings.json de la classe Startup. J'ai juste besoin d'un moyen facile d'y accéder. Est-ce possible?
namespace MyNamespace
{
public static class Config
{
public string Username => Configuration["Username"];
public string Password => Configuration["Password"];
}
}
Partout ailleurs dans l'application:
string username = Config.Username;
string password = Config.Password;
Je suis d’accord avec mcbowes, c’est dans docs , mais le premier exemple ressemble plus à ce dont vous avez besoin ... voulez:
public class Program
{
public static IConfigurationRoot Configuration { get; set; }
public static void Main(string[] args = null)
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json");
Configuration = builder.Build();
Console.WriteLine($"option1 = {Configuration["option1"]}");
// Edit:
IServiceCollection services = new ServiceCollection();
services.AddOptions();
services.Configure<HelloWorldOptions>(_configuration.GetSection("HelloWorld"));
// And so on...
}
}
Une version légèrement plus courte basée sur le même principe que ci-dessus ...
public Startup(IConfiguration configuration)
{
Configuration = configuration;
StaticConfig = configuration;
}
public static IConfiguration StaticConfig { get; private set; }
Pour utiliser dans une autre classe statique:
string connString = Startup.StaticConfig.GetConnectionString("DefaultConnection");
Essayez d'éviter d'utiliser une classe statique et utilisez DI
namespace MyNamespace {
public interface IConfig {
string Username { get; }
string Password { get; }
}
public class Config : IConfig {
public Config(IConfiguration configuration) {
_configuration = configuration;
}
readonly IConfiguration _configuration;
public string Username => _configuration["Username"];
public string Password => _configuration["Password"];
}
}
Le DI d'installation dans la classe StartUp
public class Startup {
public void ConfigureServices(IServiceCollection services) {
//...
services.AddTransient<IConfig, Config>();
...
}
}
Et l'utiliser comme ça
public class TestUsage {
public TestUsage(IConfig config) {
_config = config;
}
readonly IConfig _config;
public string Username => _config.Username;
public string Password => _config.Password;
}
Cela a déjà été dit mais je vais le dire.
Les classes statiques ne sont pas une pratique exemplaire de la programmation orientée objet. Pour cette raison, je pense que .Net Core nous fournit un moyen d’obtenir des valeurs via Dependency Inject. C’est ce que j’ai remarqué lors de mes recherches, mais je spécule aussi un peu. En tant que développeurs, nous devons suivre ce changement de paradigme afin de bien utiliser .Net Core.
Le modèle Options est une bonne alternative à la configuration statique. Dans votre cas, ça va ressembler à ça:
appsettings.json
{
"Username": "MyUsername",
"Password": "Password1234"
}
SystemUser.cs
public class SystemUser
{
public string Username { get; set; } = "";
public string Password { get; set; } = "";
}
Startup.cs
services.Configure<SystemUser>(Configuration);
Et pour utiliser la classe SystemUser, nous procédons comme suit.
TestController.cs
public class TestController : Controller
{
private readonly SystemUser systemUser;
public TestController(IOptionsMonitor<SystemUser> systemUserOptions)
{
this.systemUser = systemUserOptions.CurrentValue;
}
public void SomeMethod()
{
var username = this.systemUser.Username; // "MyUsername"
var password = this.systemUser.Password; // "Password1234"
}
}
Même si nous n'utilisons pas de classe statique, je pense que c'est la meilleure alternative qui répond à vos besoins. Sinon, vous devrez peut-être utiliser une propriété statique dans la classe Startup, ce qui est une solution effrayante.