159 votes

Comment accéder à la configuration dans n'importe quelle classe en ASP.NET Core ?

Je suis passé par documentation de configuration sur ASP.NET core. La documentation indique que vous pouvez accéder à la configuration depuis n'importe quel endroit de l'application.

Voici le fichier Startup.cs créé par le modèle

public class Startup
{
    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);

        if (env.IsEnvironment("Development"))
        {
            // This will push telemetry data through Application Insights pipeline faster, allowing you to view results immediately.
            builder.AddApplicationInsightsSettings(developerMode: true);
        }

        builder.AddEnvironmentVariables();
        Configuration = builder.Build();
    }

    public IConfigurationRoot Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container
    public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services.AddApplicationInsightsTelemetry(Configuration);

        services.AddMvc();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        loggerFactory.AddConsole(Configuration.GetSection("Logging"));
        loggerFactory.AddDebug();

        app.UseApplicationInsightsRequestTelemetry();

        app.UseApplicationInsightsExceptionTelemetry();

        app.UseMvc();
    }
}

Ainsi, en Startup.cs nous configurons tous les paramètres, Startup.cs a également une propriété nommée Configuration

Ce que je n'arrive pas à comprendre, c'est comment accéder à cette configuration dans le contrôleur ou n'importe où dans l'application ? MS recommande d'utiliser schéma des options mais je n'ai que 4 ou 5 paires clé-valeur et j'aimerais ne pas utiliser le modèle d'options. Je veux juste avoir accès à la configuration dans l'application. Comment puis-je l'injecter dans n'importe quelle classe ?

1 votes

S'il s'agit de 4-5 paires clé-valeur, vous pouvez simplement injecter ces paramètres individuels. Je recommande cette approche ou le modèle des options pour des raisons de testabilité. Les trois méthodes (y compris celle que vous avez demandée à l'origine) sont listées comme réponses dans la question suivante, qui peut être dupliquée : stackoverflow.com/questions/30263681/

0 votes

Pour accéder à la configuration sous forme de dictionnaire depuis n'importe où, vérifier cette réponse .

0 votes

Vérifiez ici pour un exemple de code complet.

175voto

Henk Mollema Points 3951

Mise à jour

Utilisation d'ASP.NET Core 2.0 automatiquement ajouter le IConfiguration de votre application dans le conteneur d'injection de dépendances. Cela fonctionne également en conjonction avec ConfigureAppConfiguration sur le WebHostBuilder .

Par exemple :

public static void Main(string[] args)
{
    var host = WebHost.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration(builder =>
        {
            builder.AddIniFile("foo.ini");
        })
        .UseStartup<Startup>()
        .Build();

    host.Run();
}

C'est aussi simple que d'ajouter le IConfiguration à la collection de services en tant qu'objet singleton dans la section ConfigureServices :

public void ConfigureServices(IServiceCollection services)
{
   services.AddSingleton<IConfiguration>(Configuration);

   // ...
}

Donde Configuration est l'instance dans votre Startup classe.

Cela vous permet d'injecter IConfiguration dans tout contrôleur ou service :

public class HomeController
{
   public HomeController(IConfiguration configuration)
   {
      // Use IConfiguration instance
   }
}

16 votes

Mollerna.... et si vous voulez injecter la configuration dans un projet de bibliothèque de classe séparé dans la solution ? J'ai essayé comme ceci private static IConfiguration _configuration { get ; set ; } public DatabaseHelpers(IConfiguration configuration) { _configuration = configuration ; } mais _configuration est toujours nulle... elle n'est jamais utilisée dans le constructeur.

1 votes

@dinotom vous devez ajouter DatabaseHelpers à la IServiceCollection en Startup.ConfigureServices . De même, pour le motif DI, le champ privé DatabaseHelpers._configuration doivent être déclarés readonly pero no static . Ils seront tous des pointeurs vers la même instance dans ce cas, mais DatabaseHelpers ne le "sait" pas. Cela pourrait aussi interférer avec les tests unitaires.

4 votes

Cela dit, faire circuler IConfiguration comme ça, ça fuit beaucoup. Il est de loin préférable d'utiliser le Modèle d'options .

36voto

ScottC Points 406

Je sais que c'est vieux, mais étant donné les modèles IOptions, c'est relativement simple à mettre en œuvre :

  1. Classe avec des propriétés publiques get/set qui correspondent aux paramètres de la configuration.

    public class ApplicationSettings
    {
        public string UrlBasePath { get; set; }
    }
  2. enregistrer vos paramètres

    public void ConfigureServices(IServiceCollection services)
    {
     ...
     services.Configure<ApplicationSettings>(Configuration.GetSection("ApplicationSettings"));
    ...
    }
  3. injecter via IOptions

    public class HomeController
    {
       public HomeController(IOptions<ApplicationSettings> appSettings)
       { ...
        appSettings.Value.UrlBasePath
        ...
        // or better practice create a readonly private reference
        }
     }

Je ne vois pas pourquoi vous ne feriez pas ça.

2 votes

2 votes

Comment accéder aux valeurs de "appsettings.json" directement dans une classe personnalisée ?

3 votes

@JedatKinports vous devez ajouter les dépendances Nuget Microsoft.Extensions.Configuration , Microsoft.Extensions.Configuration.Binder y Microsoft.Extensions.Configuration.Json et ensuite vous chargez appsettings.json comme var config = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build‌​(); ..et vous devez aussi vous assurer appsettings.json la copie dans le répertoire de sortie est définie sur copy always

24voto

konzo Points 925

Il est également possible de faire configuration static dans startup.cs de sorte que ce que vous pouvez y accéder n'importe où avec facilité, les variables statiques sont pratiques hein !

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

internal static IConfiguration Configuration { get; private set; }

La configuration est ainsi accessible partout grâce à Startup.Configuration.GetSection... Qu'est-ce qui peut mal tourner ?

5 votes

C'est de loin le plus simple.

9voto

JedatKinports Points 2155

Je le fais comme ça en ce moment :

// Requires NuGet package Microsoft.Extensions.Configuration.Json

using Microsoft.Extensions.Configuration;
using System.IO;

namespace ImagesToMssql.AppsettingsJson
{
    public static class AppSettingsJson
    {           
        public static IConfigurationRoot GetAppSettings()
        {
            string applicationExeDirectory = ApplicationExeDirectory();

            var builder = new ConfigurationBuilder()
            .SetBasePath(applicationExeDirectory)
            .AddJsonFile("appsettings.json");

            return builder.Build();
        }

        private static string ApplicationExeDirectory()
        {
            var location = System.Reflection.Assembly.GetExecutingAssembly().Location;
            var appRoot = Path.GetDirectoryName(location);

            return appRoot;
        }
    }
}

Et puis je l'utilise lorsque j'ai besoin de récupérer les données du fichier appsettings.json :

var appSettingsJson = AppSettingsJson.GetAppSettings();
// appSettingsJson["keyName"]

1 votes

Enfin quelque chose qui fonctionne dans une méthode statique sans dépendre de la folie des injecteurs. Enfin l'indépendance paradoxale ! ;-)... mais tellement de dépendances au packacge NuGet aaargh !

2 votes

Il convient d'ajouter Microsoft.Extensions.Configuration et Microsoft.Extensions.Configuration.Json à ce code de travail.

0 votes

Est-ce que cette méthode signifie que vous devez sacrifier la possibilité d'utiliser appsettings.Development.json pour remplacer automatiquement les valeurs dans appsettings.json au moment du développement ?

3voto

pursang Points 370

J'ai regardé dans l'échantillon du modèle d'options et j'ai vu ceci :

public class Startup
{
    public Startup(IConfiguration config)
    {
        // Configuration from appsettings.json has already been loaded by
        // CreateDefaultBuilder on WebHost in Program.cs. Use DI to load
        // the configuration into the Configuration property.
        Configuration = config;
    }
...
}

En ajoutant Iconfiguration dans le constructeur de ma classe, j'ai pu accéder aux options de configuration via DI.

Exemple :

public class MyClass{

    private Iconfiguration _config;

    public MyClass(Iconfiguration config){
        _config = config;
    }

    ... // access _config["myAppSetting"] anywhere in this class
}

0 votes

Cela fonctionne-t-il sans mentionner explicitement MyClass dans Startup.cs, quelque chose comme ceci ? services.AddTransient<MyClass>() ;

0 votes

Oui, en fait, vous devez mentionner les classes que vous voulez injecter dans Startup.cs, et non l'inverse. Mais IConfiguration est je pense par défaut déjà disponible pour l'injection.

0 votes

Oui, ça marche. J'ai essayé après avoir fait le commentaire et l'implémentation de la configuration a été injectée dans IConfiguration. Merci quand même :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X