web-dev-qa-db-fra.com

ASP.NET 5 (vNext) - Obtention d'un paramètre de configuration

J'écris une application de base pour apprendre ASP.NET 5. Un domaine que je trouve très déroutant est la configuration. Avant ASP.NET 5, je pouvais faire ce qui suit:

var settingValue = ConfigurationManager.AppSettings["SomeKey"];

J'aurais des lignes de code comme ça dispersées dans mon code. Maintenant, dans le monde vNext, j'ai un fichier config.json qui ressemble à ceci:

config.json

{
  "AppSettings": {
    "SomeKey":"SomeValue"
  }
}

Ensuite, dans Startup.cs, j'ai les éléments suivants: Startup.cs

public IConfiguration Configuration { get; set; }
public Startup(IHostingEnvironment environment) 
{
  Configuration = new Configuration()
      .AddJsonFile("config.json");
}

De là, je suis totalement perplexe. J'ai MyClass.cs dans /src/Website/Code/Models/MyClass.cs.

MyClass.cs

public class MyClass
{
  public string DoSomething() 
  {
    var result = string.Empty;
    var keyValue = string.Empty; // TODO: What do I do here? How do I get the value of "AppSettings:SomeKey"?
    return result;
  }
}

Comment puis-je obtenir la valeur de "AppSettings: SomeKey"?

40
xam developer

Je recommande fortement d'utiliser le OptionsModel au lieu de lire la configuration directement. Il permet un modèle typé fort lié à la configuration.

Voici un exemple: GitHub.com/aspnet/Options/test/Microsoft.Extensions.Options.Test/OptionsTest.cs

Pour votre cas particulier, créez un modèle:

class AppSettings {
    public string SomeSetting {get;set;}
}

puis liez-le à votre configuration:

var config = // The configuration object
var options = ConfigurationBinder.Bind<AppSettings>(config); 
Console.WriteLine(options.SomeSetting);

De cette façon, vous n'avez pas à vous soucier d'où vient le paramètre, comment il est stocké ou quelle est la structure. Vous prédéfinissez simplement votre modèle d'options et la magie opère.

13
Victor Hurdugaci

ASP.NET 5 fait un usage intensif de l'injection de dépendance, donc si vous utilisez également l'injection de dépendance, cela est très simple. Si vous examinez l'exemple de projet MVC6, vous pouvez voir comment cela fonctionne:

Tout d'abord, il existe une classe AppSettings définie dans Propriétés, qui est une version fortement typée des options prises en charge par votre classe. Dans l'exemple de projet, cela ne contient que SiteTitle.

public class AppSettings
{
    public string SiteTitle { get; set; }
}

Ensuite, cette classe est initialisée via l'injection de dépendances dans ConfigureServices. Configuration voici celui que vous avez créé dans le constructeur de la classe Startup.

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<AppSettings>(Configuration.GetSubKey("AppSettings"));
    // ...
}

Ensuite, en supposant que votre classe est instanciée par le conteneur d'injection de dépendance, vous pouvez simplement demander une IOptions et vous en obtiendrez une. Par exemple, dans un contrôleur, vous pourriez avoir les éléments suivants:

public class HomeController
{
    private string _title;
    public HomeController(IOptions<AppSettings> settings) 
    {
        _title = settings.Options.SiteTitle;
    }
}
15
Richard

J'utilise l'injection de dépendance ASP.NET 5, comme ça.

config.json:

{
    "random":  "Hello World!"
}

startup.cs:

public class Startup
{
    public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv)
    {
        var builder = new ConfigurationBuilder(appEnv.ApplicationBasePath)
            .AddJsonFile("config.json");

        Configuration = builder.Build();
    }

    public IConfiguration Configuration { get; set; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
        services.AddSingleton<IConfiguration>(sp => { return Configuration; });
    }

    public void Configure(IApplicationBuilder app)
    {
        app.UseMvc(routes =>
        {
            routes.MapRoute(name: "default", template: "{controller=Home}/{action=Index}/{id?}");
        });

    }

}

Manette:

public class HomeController : Controller
{

    IConfiguration config;

    public HomeController(IConfiguration config)
    {
        this.config = config;
    }

    public IActionResult Index()
    {
        var template = "<Marquee>{0}</Marquee>";
        var content = string.Format(template, config.Get("random"));
        return Content(content, "text/html");
    }
}
14
Andy Taw

Utilisez ceci:

var value = Configuration.Get("AppSettings:SomeKey");

Basé sur cet article de blog . Le deux-points est similaire à la notation par points et est utilisé pour la navigation dans la hiérarchie.

Si vous avez besoin de la valeur dans d'autres classes, vous devez l'injecter. ASP.NET a intégré l'injection de dépendances, mais si vous n'avez besoin que d'une seule instance de MyClass, vous pouvez la créer au lieu de configurer un conteneur DI.

public IConfiguration Configuration { get; set; }

public Startup(IHostingEnvironment environment) 
{
    Configuration = new Configuration()
      .AddJsonFile("config.json");
    //generally here you'd set up your DI container. But for now we'll just new it up
    MyClass c = new MyClass(Configuration.Get("AppSettings:SomeKey"));
}

public class MyClass
{
    private readonly string Setting; //if you need to pass multiple objects, use a custom POCO (and interface) instead of a string.

    public MyClass(string setting) //This is called constructor injection
    {
        Setting = setting;
    }

    public string DoSomething() 
    {
        var result = string.Empty;
        //Use setting here
        return result;
    }
}
12
mason