06 de dezembro de 2022 • 3 min de leitura
Obtendo valores do AppSetings.json
As várias formas de obter os valores do appsettings.json
Continuando a nossa peregrinação por dentro do appsettings.json, neste post vamos aprender algumas das diversas formas de se obter um valor dele. Modifiquei um pouco o projeto do post anterior e adicionei uma controller Home, para que possamos visualizar melhor os exemplos.
Dado nosso appsettings
{
"AllowedHosts": "*",
"Boleano": false,
"MinhasConfigs": {
"PropCompartilhada": "esta propriedade será a mesma em todos os ambientes.",
"PropReescrita": "esta propriedade esta sendo reescrita pelo ambiente: ",
"DemaisConfigs": {
"Param1": "ok",
"ParamBoleano": true
}
},
"ConnectionStrings": {
"MeuApp": "aqui vai a connection string"
}
}Agora imagine que precisamos desses valores em algum ponto do nosso código, como podemos obter esses valores da melhor forma? Como tudo na vida há diversas formas corretas de se fazer o que queremos, desde a mais simples até a mais complexa, dito isso vamos pro código.
A própria interface IConfiguration
Como na maioria dos exemplos vamos precisar injetar a interface IConfiguration, não pensei em nada para colocar no título rsrsrsrs (ok falta um pouco de criatividade aqui). Essa é a forma mais simples de se obter os valores, pois quando injetamos a interface IConfiguration em uma classe, temos acesso já temos acesso as configurações. Para acessar a propriedade/chave que queremos devemos informa-la entre colchetes, e caso ela esteja aninhada utilizamos ":" para navegar até ela. Abaixo o código para exemplo:
var exem1 = _configuration["Boleano"];
var exem1Aninhado = _configuration["MinhasConfigs:PropCompartilhada"];Bem simples né? Mas temos que ficar de olho em alguns detalhezinhos, este cara só retorna um único valor da config, devemos informar a hierarquia exata da propriedade JSON e o retorno desse cara é string, então se for utilizar esse método ficar atento a isso.
GetValue
Este cara também irá nos retornar um único valor da config, o método possui um parâmetro de tipo
Esse método já é um tico melhor que o anterior, pois pode converter o valor das configurações para o tipo especificado e também podemos especificar o valor padrão a ser retornado caso a configuração não seja encontrada. Abaixo o código para exemplo:
var ex2 = _configuration.GetValue<bool>("MinhasConfigs:DemaisConfigs:ParamBoleano");
// aqui vamos tentar obter um valor inexistente justamente para vermos o valor default
var ex2ValorDefault = _configuration.GetValue<string>("MinhasConfigs", "valor não encontrado");GetSection
Nossos exemplos anteriores obtemos somente o valor de uma única propriedade, mas e precisarmos obter uma seção inteira da configuração? É aí que entra o GetSection, ele retorna uma subseção de configuração com a chave da sessão especificada nele. Ao contrário dos exemplos anteriores ele nunca retorna null, se ele não encontrar a sessão ele retornará um objeto ConfigurationSection vazio. Devemos nos atentar a um detalhezinho aqui também quando o GetSection encontra e retorna uma seção, seu Value não é preenchido somente Key e Path são retornados. Abaixo alguns exemplos:
var ex3 = _configuration.GetSection("MinhasConfigs");
// Fazendo binding da section para a classe MinhasConfigs
var ex3Binding = _configuration.GetSection("MinhasConfigs").Get<MinhasConfigs>();
// Aqui podemos navegar entre as sessões e buscar um valor especifico
var ex3ValorEspecifico = _configuration.GetSection("MinhasConfigs").GetSection("DemaisConfigs").GetSection("ParamBoleano").Value;
// Outra forma de buscar o valor agora usando o GetValue<T>
var ex3GetValue = _configuration.GetSection("MinhasConfigs").GetSection("DemaisConfigs").GetValue<bool>("ParamBoleano");
// Outra forma de buscar o valor agora em linha
var ex3GetSectionInLine = _configuration.GetSection("MinhasConfigs:DemaisConfigs:ParamBoleano").Value;Note que podemos adicionar o GetValue para especificar o retorno e também podemos fazer o binding da seção para uma classe e para ilustrar o que foi dito antes uma imagem do objeto retornado na variável ex3:
Binding do GetSection
Podemos fazer o binding do GetSection direto no construtor da nossa classe, reaproveitando a variável caso precisemos dela em mais lugares do nosso código.
public HomeController(IConfiguration configuration)
{
_configuration = configuration;
// Binding
_minhasConfigs = new MinhasConfigs();
configuration.GetSection("MinhasConfigs").Bind(_minhasConfig);
}Pela interface IOptions
Esta aqui vai dar um pouquinho mais de trabalho rsrsrs
Primeiro precisamos configurar a Injeção de Dependência no Program.cs
builder.Services.Configure<MinhasConfigs>(builder.Configuration.GetSection("MinhasConfigs"));Tudo o que precisamos é adicionar a linha acima no código e com a ajuda do método Configure, estabelecemos que a seção "MinhasConfigs" será a fonte de dados da classe MinhasConfigs. A partir daí temos um acesso fortemente tipado à seção de configuração pela Injeção da interface IOptions na classe que iremos usar as configs. Abaixo exemplo:
public HomeController(IConfiguration configuration, IOptions<MinhasConfigs> minhasConfigsOptions)
{
_configuration = configuration;
// Binding
_minhasConfigs = new MinhasConfigs();
configuration.GetSection("MinhasConfigs").Bind(_minhasConfigs);
// options pattern
_minhasConfigsOptions = minhasConfigsOptions.Value;
}Assim chegamos ao fim deste post, com algumas das formas que eu lembro rsrsrs. Foi utilizado como referência neste post as seguintes docs da Microsoft Configuration Options Pattern.
O código feito neste post pode ser encontrado aqui.
Até breve!