DEV Community

Tobias Mesquita for Quasar Framework Brasil

Posted on • Edited 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 Quasar Framework Brasil

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