DEV Community

Tobias Mesquita for Quasar Framework Brasil

Posted on • Updated on

 

QPANC - Parte 3 - ASP.NET - Registrando Serviços e Lendo Variáveis de Ambiente

QPANC são as iniciais de Quasar PostgreSQL ASP NET Core.

6 Lendo variáveis de ambiente

6.1 adicionando uma string de conexão as variáveis de ambiente

Primeiro, precisamos incluir nas nossas variaveis de ambiente, uma string de conexão, para tal, edite o docker-compose.override.yml:

version: '3.4'

services:
  qpanc.api:
    environment:
      - DEFAULT_CONNECTION=Server=qpanc.database;Port=5432;Database=postgres;User Id=postgres;Password=keepitsupersecret;
    ...
  qpanc.database:
    ...

6.2 Definindo as demais interfaces

Agora precisaremos adicionar as demais interfaces à blibioteca QPANC.Services.Abstract, mas antes, precisaremos adicionar um pacote à blibioteca:

cd QPANC.Services.Abstract
dotnet add package Microsoft.Extensions.Configuration.Abstractions
dotnet add package System.ComponentModel.Annotations

então, crie as interfaces IConfiguration, IAppSettings e IConnectionStrings.:

using Microsoft.Extensions.Configuration;

namespace QPANC.Services.Abstract
{
    public interface IConfiguration
    {
        IConfigurationRoot Root { get; }
    }
}
namespace QPANC.Services.Abstract
{
    public interface IAppSettings
    {
        IConnectionStrings ConnectionString { get; }
    }
}
namespace QPANC.Services.Abstract
{
    public interface IConnectionStrings
    {
        string DefaultConnection { get; }
    }
}

A interface IConfiguration será responsável por ler as configurações, ela será uma dependência de todas as classes de Configuração, tais como à IConnectionStrings.

A interface IAppSettings será uma agregadora das classes de configuração.

Desta forma, qual nova interface utilizar para configurar a aplicação, terá uma estrutura similar à IConnectionStrings. sendo dependente da IConfiguration e sendo uma dependência para à IAppSettings.

7.2 Implementando as interfaces

Agora, iremos voltar a nossa atenção para o projeto QPANC.Services, instale os seguintes pacotes nele:

cd QPANC.Services
dotnet add package Microsoft.AspNetCore.Hosting.Abstractions
dotnet add package Microsoft.Extensions.Configuration.Binder
dotnet add package Microsoft.Extensions.Configuration.EnvironmentVariables
dotnet add package Microsoft.Extensions.Configuration.Json

Agora iremos começar a implementar as nossas interfaces, para tal, crie as classes Configuration, ConnectionStrings e AppSettings.

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using IConfiguration = QPANC.Services.Abstract.IConfiguration;

namespace QPANC.Services
{
    public class Configuration : IConfiguration
    {
        public IConfigurationRoot Root { get; }

        public Configuration(IHostingEnvironment env)
        {
            var builder = new ConfigurationBuilder()
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                .AddEnvironmentVariables();
            this.Root = builder.Build();
        }
    }
}
using Microsoft.Extensions.Configuration;
using QPANC.Services.Abstract;
using IConfiguration = QPANC.Services.Abstract.IConfiguration;

namespace QPANC.Services
{
    public class ConnectionStrings : IConnectionStrings
    {
        private IConfiguration _configuration;

        public ConnectionStrings(IConfiguration configuration)
        {
            this._configuration = configuration;
        }

        public string DefaultConnection { get { return this._configuration.Root.GetValue<string>("DEFAULT_CONNECTION"); } }
    }
}
using QPANC.Services.Abstract;

namespace QPANC.Services
{
    public class AppSettings : IAppSettings
    {
        public IConnectionStrings ConnectionString { get; }

        public AppSettings(IConnectionStrings connectionStrings)
        {
            this.ConnectionString = connectionStrings;
        }
    }
}

6.3 Registrando os serviços

Agora que finalizamos a implementação dos serviços, iremos criar uma extensão para registrá-los, para tal, vá ao projeto QPANC.Api, crie a pasta Extensions, então crie a classe estática ServiceCollectionExtensions.

using Microsoft.Extensions.DependencyInjection;
using QPANC.Services;
using QPANC.Services.Abstract;

namespace QPANC.Api.Extensions
{
    public static class ServiceCollectionExtensions
    {
        public static void AddAppSettings(this IServiceCollection services)
        {
            services.AddSingleton<IConfiguration, Configuration>();
            services.AddSingleton<IConnectionStrings, ConnectionStrings>();
            // services.AddSingleton<IJwtBearer, JwtBearer>();
            services.AddSingleton<IAppSettings, AppSettings>();
        }
    }
}

agora, precisamos apenas chamar o método acima no QPANC.Api.Startup

...
using QPANC.Api.Extensions;

namespace QPANC.Api
{
    public class Startup
    {
        ...
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
            services.AddAppSettings();
        }
        ...
    }
}

6.4 testando os serviços

agora, para testar, injete o IAppSettings settings no método Configure do Startup

...
using QPANC.Api.Extensions;

namespace QPANC.Api
{
    public class Startup
    {
        ...
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IAppSettings settings)
        {
            Console.WriteLine(settings.ConnectionString.DefaultConnection);
            ...
        }
    }
}

caso coloque um breakpoint e execute o código, deverá ver algo como:

Connection String Breakpoint

Top comments (3)

Collapse
 
w3web profile image
Marcelo Gondim • Edited

docker-compose.override.yml ta errado... o correto é DEFAULT_CONNECTION
está dando erro no IJwtBearer, JwtBearer no arquivo ServiceCollectionExtensions (não tem a class nem interface)

Collapse
 
tobymosque profile image
Tobias Mesquita

obrigado pelo feedback.
a implementação do IJwtBearer ocorre no parte 7, então não há pq ele está aqui agora.

Collapse
 
franfrlor profile image
franfrLor

The IConnectionStrings interface is missing

50 CLI Tools You Can't Live Without

>> Check out this classic DEV post <<