tutorial onpostasync net mvc español asp asp.net-core-mvc

asp.net core mvc - onpostasync - ASP.NET Core: acceso a la configuración desde la clase estática



asp.net mvc (6)

Considere el uso de las instrucciones docs para la configuración del núcleo de ASP.NET.

Puede crear una clase para almacenar sus ajustes de configuración y luego acceder a los valores, algo como esto:

_config.UserName

En Inicio - ConfigureServices:

services.Configure<Config>(Configuration.GetSections("General"));

Luego simplemente inyecte su objeto donde lo necesite como:

IOptions<Config> config

Quiero una clase estática simple que acceda al objeto de configuración. Toda la información de configuración ya se lee desde el archivo appsettings.json en la clase de inicio. Solo necesito una forma fácil de acceder a ella. es posible?

namespace MyNamespace { public static class Config { public string Username => Configuration["Username"]; public string Password => Configuration["Password"]; } }

En cualquier otro lugar de la aplicación:

string username = Config.Username; string password = Config.Password;


El IConfiguration es inyectable en cualquier parte dentro del proyecto. Pero en el caso de la clase estática, la opción que estoy usando y quizás solo se aproxima a ... var Configuration = new ConfigurationBuilder() .AddUserSecrets<Startup>() .Build(); Y, puede agregar la sección requerida, como en este bloque de código anterior, agregué ''UserSecrets''.


Esto ya se ha dicho pero lo voy a decir.

Las clases estáticas no son una buena práctica de programación orientada a objetos. Creo que por esta razón, .Net Core nos proporciona una manera de obtener valores a través de Dependency Inject. Esto es lo que he notado de mi investigación, pero también estoy especulando un poco. Como desarrolladores, tenemos que seguir este cambio de paradigma para utilizar bien .Net Core.

El patrón de opciones es una buena alternativa a la configuración estática. En tu caso, se verá así:

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

Y para usar la clase SystemUser, hacemos lo siguiente.

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

Aunque no estamos utilizando una clase estática, creo que esta es la mejor alternativa que se adapta a sus necesidades. De lo contrario, es posible que tenga que usar una propiedad estática dentro de la clase de inicio, que es una imo de solución aterradora.


Estoy de acuerdo con mcbowes, está en los docs , pero el primer ejemplo se parece más a lo que necesitas ... quieres:

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


Intenta evitar usar una clase estática y usa 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"]; } }

La configuración DI en la clase de inicio

public class Startup { public void ConfigureServices(IServiceCollection services) { //... services.AddTransient<IConfig, Config>(); ... } }

Y usalo asi

public class TestUsage { public TestUsage(IConfig config) { _config = config; } readonly IConfig _config; public string Username => _config.Username; public string Password => _config.Password; }


Una versión ligeramente más corta basada en el mismo principio que el anterior ...

public Startup(IConfiguration configuration) { Configuration = configuration; StaticConfig = configuration; } public static IConfiguration StaticConfig { get; private set; }

Para usar en otra clase estática:

string connString = Startup.StaticConfig.GetConnectionString("DefaultConnection");