web-dev-qa-db-fra.com

ASP.NET Core - accédez à la configuration à partir d'une classe statique

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;
26
birdus

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...
    }
}
6
Tubbe

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");
4
DeanC

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;
  }
3
tb-mtg

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.

0
christo8989