Configuración fuertemente tipada en ASP.NET Core 2.0
En esta entrada, voy a tratar de explicar como podemos crear propiedades de configuración en nuestras aplicaciones ASP.NET Core, de manera que esta configuración esté fuertemente tipada y evitemos errores en tiempo de ejecución al dar por hecho que la configuración ya existe.
Para mostrar este procedimiento, voy a utilizar la plantilla de ASP.NET Core MVC por defecto, dónde se muestra un controlador, HomeController, y tres vistas, la Index o principal, la vista About, y la vista Contact.
Finalmente, voy a fijarme en esta última, que tiene un aspecto similar al que voy a poner en la siguiente imagen.
Como puedes observar, he marcado una serie de valores que aparecen dentro de esta página y que están introducidos dentro del fichero cshtml.
Lo que voy a tratar de hacer, es introducir estos valores dentro del archivo de configuración de la aplicación, para cargarlos en tiempo de ejecución de nuestra aplicación Web, y mostrarlos dentro de esta vista.
Para ello, empezaremos abriendo el archivo appsettings.json, dentro del cuál, meteré un grupo de datos , en concreto los siguientes datos:
De tal manera, nuestro appsettings.json quedará de la siguiente manera:
{ "Logging": { "IncludeScopes": false, "Debug": { "LogLevel": { "Default": "Warning" } }, "Console": { "LogLevel": { "Default": "Warning" } } }, "Contact": { "Address": "One Microsoft Way|Redmond, WA 98052-6399|Phone: 425.555.0100", "SupportDetails": { "Name": "Support:", "Mail": "Support@example.com" }, "MarketingDetails": { "Name": "Marketing:", "Mail": "Marketing@example.com" } } }
Una vez hecho esto, el siguiente paso será el de crear una clase que represente esta estructura de configuración que nos permita cargar los datos de configuración de forma directa.
El código de la clase ContactSettings es el siguiente:
public class ContactSettings { private string _address; public string Address { get { if (!String.IsNullOrEmpty(_address)) { _address = _address.Replace("|", "<br />"); } return _address; } set { _address = value; } } public SupportSettings SupportDetails { get; set; } public MarketingSettings MarketingDetails { get; set; } public ContactSettings() { MarketingDetails = new MarketingSettings(); SupportDetails = new SupportSettings(); } public class SupportSettings { public string Name { get; set; } public string Mail { get; set; } } public class MarketingSettings { public string Name { get; set; } public string Mail { get; set; } } }
Como podemos apreciar en esta clase, hemos representado dentro de ella la estructura completa del JSON.
Además, hemos transformado el contenido de la propiedad Address por el que nos conviene mostrar en la vista.
Aquí, lo más importante a tener en cuenta es que las propiedades tengan EL MISMO NOMBRE que los atributos Key del JSON.
Una vez hecho esto, vamos a cargar la información del JSON en esta clase.
Para ello, abriremos el archivo Startup.cs y cambiaremos el contenido del método ConfigureServices por este código:
public void ConfigureServices(IServiceCollection services) { services.Configure<ContactSettings>(Configuration.GetSection("Contact")); services.AddMvc(); }
A continuación, abriremos la vista Contact.cshtml y modificaremos su contenido por este otro:
@{ ViewData["Title"] = "Contact"; } <h2>@ViewData["Title"].</h2> <h3>@ViewData["Message"]</h3> <address> @Html.Raw(@ViewData["ContactAddress"]) </address> <address> <strong>@ViewData["ContactSupportName"]</strong> <a href="mailto:@ViewData["ContactSupportMail"]">@ViewData["ContactSupportMail"]</a><br /> <strong>@ViewData["ContactMarketingName"]</strong> <a href="mailto:@ViewData["ContactMarketingMail"]">@ViewData["ContactMarketingMail"]</a> </address>
Por último, acudiremos al controlador Home que es el carga la vista Contact.cshtml, y lo adecuaremos a nuestras necesidades.
public class HomeController : Controller { private readonly ContactSettings _contactSettings; public HomeController(IOptions<ContactSettings> contactSettings) { _contactSettings = contactSettings.Value; } public IActionResult Index() { return View(); } public IActionResult About() { ViewData["Message"] = "Your application description page."; return View(); } public IActionResult Contact() { ViewData["Message"] = "Your contact page."; ViewData["ContactAddress"] = _contactSettings.Address; ViewData["ContactSupportName"] = _contactSettings.SupportDetails.Name; ViewData["ContactSupportMail"] = _contactSettings.SupportDetails.Mail; ViewData["ContactMarketingName"] = _contactSettings.MarketingDetails.Name; ViewData["ContactMarketingMail"] = _contactSettings.MarketingDetails.Mail; return View(); } public IActionResult Error() { return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier }); } }
Cuando ejecutamos nuestra aplicación y cargamos su configuración, mostramos por pantalla los datos que hemos obtenido en el archivo de configuración como puede verse en la siguiente imagen.
Espero que te haya sido de utilidad.
¡Happy Coding!