3
respostas

Appsettings.json no controller

Boa noite,

No antigo ASP.NET, eu costumava pegar os valores do WebConfig utilizando ConfigurationManager.AppSettings

No .Net Core percebi que que posso armazenar informações no appsettings.json. Como faço por exemplo para pegar as informações desse arquivo em um controller ou view?

abs :)

3 respostas

Olá, Bruno

Vamos começar pelo arquivo appsetings.json. Digamos que sua configuração seja definida pelo arquivo abaixo:

{
    "ConnectionStrings": {
        "Blog": "Server=(localdb)\\mssqllocaldb;Database=MeuBlog;Trusted_Connection=True;"
    },  
    "Security": {
        "Language" : "pt-BR",
        "SuperUser": {
            "Login": "bgiorgione",
            "Email": "bgiorgione@bgiorgione.com.br",
            "ShowEmail": "true"
        },
        "Admin": {
            "Login": "moliveira",
            "Email": "mclricardo@gmail.com.br",
            "ShowEmail": "false"
        }
    }
}

Listagem: o arquivo appsetings.json

Todos os método de que precisamos precisam vir da classe Configuration, que é uma implementação da interface IConfiguration.

O primeiro passo seria configurar o mecanismo de injeção de dependência do ASP.NET Core para obter o objeto de configuração. Mas felizmente esse objeto já vem automaticamente registrado internamente no contêiner de injeção de dependência do ASP.NET Core, portanto você não precisa adicionar o código services.AddSingleton<IConfiguration>(Configuration); na sua classe Startup.

Agora, como vimos no curso, basta adicionar um parâmetro IConfiguration no construtor do controller para começarmos a obter as configurações:

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;

namespace Blog.Controllers
{
    public class BlogController : Controller
    {
        private IConfiguration _configuration;

        public BlogController(IConfiguration Configuration)
        {
            _configuration = Configuration;
        }

        public IActionResult Usuarios()
        {
            // Configuração usando a string de chave
            ViewData["SecurityLanguage"] = _configuration["Security:Language"];

            // Configuração usando método GetSection

            ViewData["SecuritySuperUserLogin"] = 
            _configuration.GetSection("Security").GetSection("SuperUser").GetSection("Login");

            // Configuração usando GetSection e string de chave ao mesmo tempo
            ViewData["SecuritySuperUserEmail"] = 
                _configuration.GetSection("Security")["SuperUser:Email"];

            // Configuração usando GetSection e string de chave ao mesmo tempo
            ViewData["SecuritySuperUserShowEmail"] = 
                _configuration.GetSection("Security")["SuperUser:ShowEmail"];

            return View();
        }
    }
}

Listagem: o arquivo BlogController.cs

No exemplo acima, populamos o ViewData com as configuração. Mas você pode utilizar as configurações como quiser, claro.

Agora basta exibir os dados na view Usuarios:

<p>
    SecurityLanguage <strong>@ViewData["SecurityLanguage"]</strong><br />
    SecuritySuperUserLogin <strong>@ViewData["SecuritySuperUserLogin"]</strong><br />
    SecuritySuperUserEmail <strong>@ViewData["SecuritySuperUserEmail"]</strong>
    SecuritySuperUserShowEmail <strong>@ViewData["SecuritySuperUserShowEmail"]</strong>
</p>

Listagem: o arquivo Usuarios.cshtml

Olá Marcelo,

Muito obrigado funcionou perfeitamente :)

Só mais uma dúvida. Eu costumo desenvolver meus projetos utilizando camadas. No caso é possível acessar o appsettings.json através de uma class Library? Ou então mesmo criar esse arquivo dentro da class library? Assim consigo isolar a ConnectionStrings em um projeto a parte. É possível isso?

abs

Excelente, Bruno, que bom que funcionou!

Você pode acessar as configurações do mesmo arquivo appsettings.json numa class library, basta fazer injeção de dependência do parâmetro IConfiguration :

    public class ClassLibrary_MyClass : Controller
    {
        private IConfiguration _configuration;

        public ClassLibrary_MyClass(IConfiguration Configuration)
        {
            _configuration = Configuration;
        }

Mas cuidado: para instanciar essa classe, não faça diretamente:

IClassLibrary_MyClass minhaClasse = new ClassLibrary_MyClass();

Por que você precisaria primeiro obter o parâmetro IConfiguration do construtor.

Em vez disso, utilize o serviceProvider para obter uma instância a partir do contêiner de injeção de dependência do ASP.NET Core:

IClassLibrary_MyClass minhaClasse = serviceProvider.GetService<IClassLibrary_MyClass>();

Mas claro que, para isso funcionar, você também precisa registrar a interface no método Startup.ConfigureServices():

services.AddTransient<IClassLibrary_MyClass, ClassLibrary_MyClass>();