Aqui estão nossas condições iniciais:
- Nosso serviço é o aplicativo de console e, ao contrário do aplicativo da Web ASP.NET Core, não tínhamos uma solução pronta para uso.
- O aplicativo é iniciado a partir do contêiner do docker.
Bem, vamos descobrir como usar a configuração múltipla em um aplicativo de console. Primeiro, vamos criar arquivos de configuração para nossos ambientes de Desenvolvimento e Teste:
Não há aninhamento padrão em aplicativos de console. Portanto, abra o arquivo de projeto .csproj e adicione:
<ItemGroup>
<Content Include="appsettings.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="appsettings.Dev.json;appsettings.Testing.json;">
<DependentUpon>appsettings.json</DependentUpon>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
Arquivos anexados com o nome do ambiente de desenvolvimento apareceram no arquivo appsettings.json:
Nos arquivos appsettings.Dev.json e appsettings.Testing.json, adicione as partes da configuração que mudam dependendo do ambiente. Vamos mudar o nome dos tópicos Kafka no loop de teste de carga adicionando os parâmetros necessários a appsettings.Testing.json:
{
"Kafka":
{
"EventMainTopicTitle": "Test_EventMain",
"EventDelayTopicTitle": "Test_EventDelay",
"EventRejectTopicTitle": "Test_EventReject"
}
}
Resta apenas selecionar o arquivo appsettings.json desejado durante o início do serviço. Para fazer isso, vamos fazer alterações na classe do programa:
///
private static IServiceProvider ConfigureServices()
{
//
const string environmentVariableName = "ASPNETCORE_ENVIRONMENT";
//
var environmentName =
Environment.GetEnvironmentVariable(environmentVariableName);
var services = new ServiceCollection();
_configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetParent(AppContext.BaseDirectory).FullName)
.AddJsonFile("appsettings.json")
// json- environmentName
.AddJsonFile($"appsettings.{environmentName}.json")
.AddEnvironmentVariables()
.Build();
services.AddSingleton(_configuration);
services.AddSingleton<KafkaHandler>();
return services.BuildServiceProvider();
}
Agora tudo está pronto para iniciar o serviço em um contêiner docker.
Resta especificar as variáveis de ambiente para o contêiner. Existem várias maneiras de fazer isso:
- linha de comando
- arquivo de texto
- docker compose
Parei de especificar variáveis na linha de comando. Aqui está um script de exemplo para criar uma imagem e executar um contêiner:
# Build image
# docker build . -t consoleapp
# Run container on Dev
# docker run -d <i>--env ASPNETCORE_ENVIRONMENT=Dev</i> --name app consoleapp
Existem soluções mais elegantes para criar um pipeline para sua implantação, mas esse método pode ser implementado em um curto espaço de tempo, o que é muito crítico no estágio inicial da criação do projeto.
Link para GitHub com o projeto .
Obrigado pela sua atenção e codificação agradável!