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