tutorial pages net mvc asp application c# asp.net .net asp.net-core .net-core

c# - pages - ASP.NET 5(vNext)-Obtener una configuración de configuración



css asp net (4)

Estoy escribiendo una aplicación básica para aprender ASP.NET 5. Un área que encuentro muy confusa es la configuración. Antes de ASP.NET 5, podía hacer lo siguiente:

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

Tendría líneas de código como las que se rocían en mi código. Ahora, en el mundo de vNext, tengo un archivo config.json que se ve así:

config.json

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

Luego, en Startup.cs, tengo lo siguiente: Startup.cs

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

A partir de ahí, estoy totalmente perplejo. Tengo MyClass.cs en /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; } }

¿Cómo obtengo el valor de "AppSettings: SomeKey"?


ASP.NET 5 hace un uso intensivo de Dependency Injection, por lo que si también está usando Dependency Injection, esto es muy simple. Si examina el proyecto MVC6 de muestra, puede ver cómo funciona esto:

En primer lugar, hay una clase AppSettings definida en Propiedades, que es una versión fuertemente tipada de las opciones que admite su clase. En el proyecto de ejemplo, esto solo contiene SiteTitle.

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

Luego, esta clase se inicializa a través de la inyección de dependencia en ConfigureServices. Configuration aquí es la que creó en el constructor de la clase de Inicio.

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

Luego, suponiendo que su clase sea instanciada por el contenedor de inyección de dependencia, simplemente puede solicitar un IOptions y obtendrá uno. Por ejemplo, en un controlador puede tener lo siguiente:

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


Recomiendo usar el OptionsModel lugar de leer la configuración directamente. Permite un fuerte enlace de modelo tipado a la configuración.

Aquí hay un ejemplo: GitHub.com/aspnet/Options/test/Microsoft.Extensions.Options.Test/OptionsTest.cs

Para su caso particular, cree un modelo:

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

y luego vincularlo a su configuración:

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

De esta forma, no tiene que preocuparse de dónde viene la configuración, cómo se almacena o cuál es la estructura. Simplemente predefine su modelo de opciones y sucede la magia.


Utilizar esta:

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

Basado en esta publicación de blog . El colon es similar a la notación de puntos y se usa para navegar por la jerarquía.

Si necesita el valor en otras clases, debe inyectarlo en. ASP.NET ha incorporado inyección de dependencia, pero si solo necesita una instancia de MyClass, puede reactivarla en lugar de configurar un contenedor 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; } }


Yo uso la inyección de dependencia ASP.NET 5, como tal.

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?}"); }); } }

Controlador:

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