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

Oldest comments (3)

Collapse
 
franfrlor profile image
franfrLor

The IConnectionStrings interface is missing

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.