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