Configuração do Aspire

Configure o AppHost do Aspire para emitir configurações explícitas de aplicativo via variáveis de ambiente; mantenha o código do aplicativo livre de clientes Aspire e descoberta de serviços.

O que é Configuração do Aspire?

Esta skill define um padrão para configurar aplicações .NET que utilizam o Aspire, garantindo que o AppHost seja o único responsável por orquestrar e expor configurações de recursos de infraestrutura (como bancos de dados e armazenamento) como variáveis de ambiente explícitas. O objetivo principal é manter o código do aplicativo limpo, sem dependências dos pacotes de cliente ou descoberta de serviço do Aspire, tornando a configuração portátil e transparente para ambientes de produção que não utilizam o Aspire. A abordagem é especialmente útil para evitar abstrações opacas, garantindo que todos os valores injetados possam ser replicados em produção via variáveis de ambiente ou arquivos de configuração. Suporta plataformas e ferramentas baseadas no .NET Aspire, como o Visual Studio e a CLI do .NET, e promove o uso de `IOptions<T>` e injeção de configuração padrão do .NET para consumir as configurações no código do aplicativo.

Funciona com✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Aaronontheweb/dotnet-skills/tree/main/skills/aspire-configuration

Installed? Explore more Programação e Desenvolvimento skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

O que Configuração do Aspire faz?

Quando Usar Esta Skill

Use esta skill quando:

  • Conectar recursos do AppHost à configuração do aplicativo em repositórios baseados em Aspire
  • Garantir que a configuração de produção seja transparente e portátil fora do Aspire
  • Evitar pacotes de cliente/descoberta de serviço do Aspire dentro do código do aplicativo
  • Projetar toggles de funcionalidades para dev/test sem alterar os caminhos do código do aplicativo

Princípios Centrais

  1. AppHost é proprietário dos pacotes de infraestrutura do Aspire

    • Os pacotes de hospedagem do Aspire pertencem exclusivamente ao AppHost.
    • Os projetos do aplicativo não devem referenciar pacotes de cliente/descoberta de serviço do Aspire.
  2. Apenas configuração explícita

    • O AppHost deve traduzir as saídas dos recursos em chaves de configuração explícitas (variáveis de ambiente).
    • O código do aplicativo vincula-se apenas a IOptions<T> ou Configuration.
  3. Paridade e transparência com produção

    • Todo valor injetado pelo AppHost deve ser representável em produção como variáveis de ambiente ou arquivos de configuração sem o Aspire.
    • Evite descoberta de serviço opaca e configuração implícita.

Fluxo de Configuração

Recurso do AppHost -> WithEnvironment(...) -> chaves de configuração do app -> IOptions<T> no app

O AppHost é responsável por transformar recursos do Aspire em configurações explícitas do aplicativo. O aplicativo nunca consome clientes Aspire ou descoberta de serviço diretamente.


Padrões do AppHost (Mapeamento Explícito)

Exemplo: Banco de Dados + Armazenamento de Blobs

// AppHost/Program.cs
var builder = DistributedApplication.CreateBuilder(args);

var postgres = builder.AddPostgres("postgres");
var db = postgres.AddDatabase("appdb");

var minio = builder.AddContainer("minio", "minio/minio")
    .WithArgs("server", "/data")
    .WithHttpEndpoint(targetPort: 9000, name: "http")
    .WithHttpEndpoint(targetPort: 9001, name: "console")
    .WithEnvironment("MINIO_ROOT_USER", "minioadmin")
    .WithEnvironment("MINIO_ROOT_PASSWORD", "minioadmin");

var api = builder.AddProject<Projects.MyApp_Api>("api")
    .WithReference(db, "Postgres")
    .WithEnvironment("BlobStorage__Enabled", "true")
    .WithEnvironment("BlobStorage__ServiceUrl", minio.GetEndpoint("http"))
    .WithEnvironment("BlobStorage__AccessKey", "minioadmin")
    .WithEnvironment("BlobStorage__SecretKey", "minioadmin")
    .WithEnvironment("BlobStorage__Bucket", "attachments")
    .WithEnvironment("BlobStorage__ForcePathStyle", "true");

builder.Build().Run();

Pontos-chave

  • WithReference(db, "Postgres") define ConnectionStrings__Postgres explicitamente.
  • Toda dependência externa é representada por chaves de configuração explícitas.
  • O projeto da API apenas lê valores de Configuration.

Padrão do Código do Aplicativo (Sem Clientes Aspire)

O código do aplicativo vincula-se a opções e inicializa SDKs diretamente. Ele nunca depende de pacotes de cliente Aspire ou descoberta de serviço.

// Api/Program.cs
builder.Services
    .AddOptions<BlobStorageOptions>()
    .BindConfiguration("BlobStorage")
    .ValidateDataAnnotations()
    .ValidateOnStart();

builder.Services.AddSingleton<IBlobStorageService>(sp =>
{
    var options = sp.GetRequiredService<IOptions<BlobStorageOptions>>().Value;
    return new S3BlobStorageService(options); // usa apenas opções explícitas
});

Não adicione pacotes de cliente Aspire (ou AddServiceDiscovery) ao aplicativo. Estas são preocupações de orquestração e devem permanecer no AppHost.


Toggles de Funcionalidades e Substituições de Teste

Mantenha os toggles na configuração e gerencie-os através do AppHost e de fixtures de teste. Isso mantém a paridade entre a configuração de dev/test e a produção.

// AppHost: desabilitar persistência em testes através de substituições de configuração
var config = builder.Configuration.GetSection("App")
    .Get<AppHostConfiguration>() ?? new AppHostConfiguration();

if (!config.UseVolumes)
{
    postgres.WithDataVolume(false);
}

api.WithEnvironment("BlobStorage__Enabled", config.EnableBlobStorage.ToString());

Consulte skills/aspire/integration-testing/SKILL.md para padrões de como passar substituições de configuração para o DistributedApplicationTestingBuilder.


Lista de Verificação: Faça / Não Faça

Faça

  • Mapeie toda saída de recurso do Aspire para chaves de configuração explícitas
  • Use IOptions<T> com validação para todas as configurações de infraestrutura
  • Mantenha o AppHost como o único lugar que referencia pacotes de hospedagem do Aspire
  • Garanta que qualquer valor injetado pelo AppHost possa ser definido em variáveis de ambiente de produção

Não Faça

  • Referencie pacotes de cliente/descoberta de serviço do Aspire em projetos do aplicativo
  • Dependa de descoberta de serviço opaca que não pode ser espelhada em produção
  • Esconda a configuração por trás de abstrações exclusivas do Aspire

Skills Relacionadas

  • skills/aspire/service-defaults/SKILL.md
  • skills/aspire/integration-testing/SKILL.md
  • skills/akka/aspire-configuration/SKILL.md

Recursos

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

akka-hosting-actor-patterns

Patterns for building entity actors with Akka.Hosting - GenericChildPerEntityParent, message extractors, cluster sharding abstraction, akka-reminders, and ITimeProvider. Supports both local testing and clustered production modes.

akka-net-aspire-configuration

Configure Akka.NET with .NET Aspire for local development and production deployments. Covers actor system setup, clustering, persistence, Akka.Management integration, and Aspire orchestration patterns.

akka-net-best-practices

Critical Akka.NET best practices including EventStream vs DistributedPubSub, supervision strategies, error handling, Props vs DependencyResolver, work distribution patterns, and cluster/local mode abstractions for testability.

akka-net-management

Akka.Management for cluster bootstrapping, service discovery (Kubernetes, Azure, Config), health checks, and dynamic cluster formation without static seed nodes.

akka-net-testing-patterns

Write unit and integration tests for Akka.NET actors using modern Akka.Hosting.TestKit patterns. Covers dependency injection, TestProbes, persistence testing, and actor interaction verification. Includes guidance on when to use traditional TestKit.

api-design

Design stable, compatible public APIs using extend-only design principles. Manage API compatibility, wire compatibility, and versioning for NuGet packages and distributed systems.

aspire-integration-testing

Write integration tests using .NET Aspire

aspire-service-defaults

Create a shared ServiceDefaults project for Aspire applications. Centralizes OpenTelemetry, health checks, resilience, and service discovery configuration across all services.

crap-analysis

Analyze code coverage and CRAP (Change Risk Anti-Patterns) scores to identify high-risk code. Use OpenCover format with ReportGenerator for Risk Hotspots showing cyclomatic complexity and untested code paths.

csharp-concurrency-patterns

Choosing the right concurrency abstraction in .NET - from async/await for I/O to Channels for producer/consumer to Akka.NET for stateful entity management. Avoid locks and manual synchronization unless absolutely necessary.

database-performance

Database access patterns for performance. Separate read/write models, avoid N+1 queries, use AsNoTracking, apply row limits, and never do application-side joins. Works with EF Core and Dapper.

dependency-injection-patterns

Organize DI registrations using IServiceCollection extension methods. Group related services into composable Add* methods for clean Program.cs and reusable configuration in tests.

dotnet-devcert-trust

Diagnose and fix .NET HTTPS dev certificate trust issues on Linux. Covers the full certificate lifecycle from generation to system CA bundle inclusion, with distro-specific guidance for Ubuntu, Fedora, Arch, and WSL2.

dotnet-local-tools

Managing local .NET tools with dotnet-tools.json for consistent tooling across development environments and CI/CD pipelines.

dotnet-project-structure

Modern .NET project structure including .slnx solution format, Directory.Build.props, central package management, SourceLink, version management with RELEASE_NOTES.md, and SDK pinning with global.json.

dotnet-slopwatch

Use Slopwatch to detect LLM reward hacking in .NET code changes. Run after every code modification to catch disabled tests, suppressed warnings, empty catch blocks, and other shortcuts that mask real problems.

efcore-patterns

Entity Framework Core best practices including NoTracking by default, query splitting for navigation collections, migration management, dedicated migration services, and common pitfalls to avoid.

ilspy-decompile

Understand implementation details of .NET code by decompiling assemblies. Use when you want to see how a .NET API works internally, inspect NuGet package source, view framework implementation, or understand compiled .NET binaries.

mailpit-integration

Test email sending locally using Mailpit with .NET Aspire. Captures all outgoing emails without sending them. View rendered HTML, inspect headers, and verify delivery in integration tests.

marketplace-publishing

Workflow for publishing skills and agents to the dotnet-skills Claude Code marketplace. Covers adding new content, updating plugin.json, validation, and release tagging.

Habilidades Relacionadas