QPANC são as iniciais de Quasar PostgreSQL ASP NET Core.
- Source
- Introdução
- Parte I - ASP.NET - Inicializando os Projetos
- Parte 2 - PostgreSQL
- Parte 3 - ASP.NET - Registrando Serviços e Lendo Variáveis de Ambiente
- Parte 4 - ASP.NET - Entity Framework e ASP.NET Core Identity
- Parte 5 - ASP.NET - Documentação Interativa com Swagger
- Parte 6 - ASP.NET - Regionalização
- Parte 7 - ASP.NET - Autenticação e Autorização
- Parte 8 - ASP.NET - CORS
- Parte 9 - Quasar - Criação e Configuração do Projeto
- Parte 10 - Quasar - Configurações e Customizações
- Parte 11 - Quasar - Componentes - Diferença entre SPA e SSR
- Parte 12 - Quasar - Serviços
- Parte 13 - Quasar - Regionalização e Stores
- Parte 14 - Quasar - Consumindo a API
- Parte 15 - Quasar - Login
- Parte 16 - Quasar - Áreas Protegidas
- Parte 17 - Quasar - Registro
- Parte 18 - Docker - Maquina Virtual Linux
- Parte 19 - Docker - Registro e Build
- Parte 20 - Docker - Traefik e Publicação
- Demo Online
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:

Top comments (3)
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)
obrigado pelo feedback.
a implementação do IJwtBearer ocorre no parte 7, então não há pq ele está aqui agora.
The IConnectionStrings interface is missing