Sitemap

Twelve-Factor Apps: Boas Práticas para Desenvolvedores .NET (parte 2)

4 min readApr 7, 2025

--

Continuando o post anterior (link)….

4. Backing Services (Serviços de Apoio)

O que são?
Serviços de apoio são recursos externos que sua aplicação usa, como bancos de dados, filas de mensagens ou serviços de cache. O conceito aqui é tratar esses serviços como recursos anexados, que podem ser substituídos sem alterações no código.

Como aplicar em .NET?

  • Use conexões configuráveis para serviços externos.
  • Utilize interfaces para implementar o uso destes serviços de forma que facilitem a troca caso seja necessário (exemplo: a troca de um serviço de cache in-memory por redis cache, ou de um banco sql por um no-sql).
  • Armazene as credenciais e URLs desses serviços em variáveis de ambiente.

Exemplo:

var dbConnectionString = Environment.GetEnvironmentVariable("DB_CONNECTION_STRING");
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(dbConnectionString));

Benefício: Trocar um banco de dados local por um banco em nuvem (ex: Azure SQL) não exigirá mudanças no código, apenas na configuração.

5. Build, Release, Run (Separação de Estágios)

O que é?
O processo de construção, liberação e execução deve ser claramente separado. Cada release deve ter um identificador único, e você deve ser capaz de fazer rollback facilmente.

Como aplicar em .NET?

  • Use ferramentas como Azure DevOps ou GitHub Actions para automatizar o pipeline de CI/CD.
  • Crie builds e releases com identificadores únicos (ex: versões ou timestamps).

Exemplo de pipeline no Azure DevOps:

- task: UseDotNet@2
inputs:
packageType: 'sdk'
version: '6.x'
- script: dotnet publish -c Release -o $(Build.ArtifactStagingDirectory)

Benefício: Você pode implantar novas versões com confiança e reverter para uma versão anterior em caso de problemas

7. Port Binding (Vinculação de Porta)

O que é?
A aplicação deve ser auto-contida e expor sua própria porta, sem depender de servidores web externos.

Como aplicar em .NET?

  • Use o Kestrel, o servidor web embutido no ASP.NET Core, para expor a aplicação diretamente.
  • Configure a porta via variáveis de ambiente.

Exemplo:

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>()
.UseUrls("http://*:5000");
});

Benefício: Sua aplicação pode ser executada em qualquer ambiente sem depender de um servidor web específico.

8. Concurrency (Concorrência)

O que é?
A aplicação deve ser projetada para escalar horizontalmente, lidando com múltiplas instâncias rodando em paralelo.

Prepare as suas aplicações para serem executadas em várias instâncias.

Utilize Web-Api´s e Worker Services sem armazenamento de estado.

Como aplicar em .NET?

  • Projete sua aplicação para ser stateless.
  • Substitua “in-memory” cache por um cache distribuído para manter suas informações (ex: Redis Cache)
  • Use filas de mensagens (ex: Azure Service Bus ou RabbitMQ) para processar tarefas em segundo plano e consuma utilizando Worker Services.

Veja o que são: Worker Services no .NET ! O que são ? para que servem ? Onde habitam? | by Marcio Nizzola | Medium

Benefício: Você pode escalar sua aplicação horizontalmente, adicionando mais instâncias conforme a demanda.

9. Disposability (Descartabilidade)

O que é?
Processos devem ser descartáveis, ou seja, podem ser iniciados e parados rapidamente, sem impactar a aplicação.

Como aplicar em .NET?

  • Implemente shutdowns graciosos para garantir que a aplicação finalize tarefas pendentes antes de parar.
  • Use o IHostApplicationLifetime para gerenciar o ciclo de vida da aplicação.

Exemplo:

public class Worker : IHostedService
{
private readonly IHostApplicationLifetime _appLifetime;

public Worker(IHostApplicationLifetime appLifetime)
{
_appLifetime = appLifetime;
}

public Task StartAsync(CancellationToken cancellationToken)
{
_appLifetime.ApplicationStopping.Register(OnStopping);
return Task.CompletedTask;
}

private void OnStopping()
{
// Finalizar tarefas pendentes
}
}

Benefício: Sua aplicação pode ser reiniciada ou escalada sem causar problemas.

10. Dev/Prod Parity (Paridade entre Desenvolvimento e Produção)

O que é?
As diferenças entre os ambientes de desenvolvimento e produção devem ser mínimas.

Como aplicar em .NET?

  • Use containers (Docker) para garantir que o ambiente seja consistente em todas as etapas.
  • Use o mesmo tipo de banco de dados e serviços externos em todos os ambientes, com a mesma estrutura de tabelas, versão do serviço, etc.

Exemplo de docker-compose.yml:

version: '3.4'
services:
web:
image: myapp
environment:
- DB_CONNECTION_STRING=Server=db;Database=myapp;User=sa;Password=Password123;
db:
image: mcr.microsoft.com/mssql/server:2019-latest
environment:
- SA_PASSWORD=Password123
- ACCEPT_EULA=Y

Benefício: Reduz o risco de problemas ao implantar em produção.

12. Admin Processes (Processos Administrativos)

O que é?
Tarefas administrativas (ex: migrações de banco de dados) devem ser executadas como processos one-off no mesmo ambiente da aplicação.

Como aplicar em .NET?

  • Use comandos CLI para executar tarefas administrativas.
  • Exemplo: Migrações com o Entity Framework Core:
dotnet ef database update

Ou crie comandos personalizados com o .NET CLI:

public class Program
{
public static void Main(string[] args)
{
if (args.Contains("--migrate"))
{
MigrateDatabase();
return;
}

CreateHostBuilder(args).Build().Run();
}

private static void MigrateDatabase()
{
// Lógica de migração
}
}

Benefício: Tarefas administrativas são executadas de forma consistente e segura.

Conclusão

Ao seguir os Twelve-Factor Apps, você estará construindo aplicações .NET mais robustas, escaláveis e fáceis de manter. Esses princípios se alinham perfeitamente com as ferramentas e práticas modernas, como Docker, ASP.NET Core e Azure.

Se você ainda não adotou esses conceitos, comece aos poucos, aplicando um fator de cada vez. Com o tempo, você verá como sua aplicação se torna mais adaptável e pronta para os desafios do desenvolvimento moderno.

Esperem a parte 3 onde irei compartilhar uma planilha que permite medir o percentual de aderência da sua aplicação.

Referências

Cloud Computing + Boas Práticas em Aplicações: Twelve-Factor App | by Renato Groffe | Medium

https://12factor.net/pt_br

--

--

Marcio Nizzola
Marcio Nizzola

Written by Marcio Nizzola

Microsoft MVP | Master Software Architect na CI&T | Prof. da Etec Itu | Membro Fundador da Comunidade Itu Developers.