skills/devops/aspire-orchestration/SKILL.md
Use when setting up .NET Aspire for local development orchestration and service discovery.
npx skillsauth add faysilalshareef/dotnet-ai-kit aspire-orchestrationInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
.NET Aspire orchestrates all microservices for local developmentAppHost project defines the service topologyServiceDefaults project provides shared configuration (OpenTelemetry, health checks)// {Company}.{Domain}.AppHost/Program.cs
var builder = DistributedApplication.CreateBuilder(args);
// Infrastructure resources
var sqlServer = builder.AddSqlServer("sql")
.WithDataVolume("sql-data");
var commandDb = sqlServer.AddDatabase("command-db");
var queryDb = sqlServer.AddDatabase("query-db");
var serviceBus = builder.AddAzureServiceBus("servicebus")
.RunAsEmulator();
// Command service
var commandService = builder.AddProject<Projects.{Company}_{Domain}_Command>("command")
.WithReference(commandDb)
.WithReference(serviceBus);
// Query service
var queryService = builder.AddProject<Projects.{Company}_{Domain}_Query>("query")
.WithReference(queryDb)
.WithReference(serviceBus);
// Processor service
var processor = builder.AddProject<Projects.{Company}_{Domain}_Processor>("processor")
.WithReference(serviceBus)
.WithReference(commandService)
.WithReference(queryService);
// Gateway
var gateway = builder.AddProject<Projects.{Company}_{Domain}_Gateway>("gateway")
.WithReference(commandService)
.WithReference(queryService)
.WithExternalHttpEndpoints();
builder.Build().Run();
// {Company}.{Domain}.ServiceDefaults/Extensions.cs
public static class Extensions
{
public static IHostApplicationBuilder AddServiceDefaults(
this IHostApplicationBuilder builder)
{
builder.ConfigureOpenTelemetry();
builder.AddDefaultHealthChecks();
builder.Services.AddServiceDiscovery();
builder.Services.ConfigureHttpClientDefaults(http =>
{
http.AddStandardResilienceHandler();
http.AddServiceDiscovery();
});
return builder;
}
public static IHostApplicationBuilder ConfigureOpenTelemetry(
this IHostApplicationBuilder builder)
{
builder.Logging.AddOpenTelemetry(logging =>
{
logging.IncludeFormattedMessage = true;
logging.IncludeScopes = true;
});
builder.Services.AddOpenTelemetry()
.WithMetrics(metrics =>
{
metrics.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation()
.AddRuntimeInstrumentation();
})
.WithTracing(tracing =>
{
tracing.AddAspNetCoreInstrumentation()
.AddGrpcClientInstrumentation()
.AddHttpClientInstrumentation();
});
builder.AddOpenTelemetryExporters();
return builder;
}
public static IHostApplicationBuilder AddDefaultHealthChecks(
this IHostApplicationBuilder builder)
{
builder.Services.AddHealthChecks()
.AddCheck("self", () => HealthCheckResult.Healthy());
return builder;
}
}
// Program.cs of any service
var builder = WebApplication.CreateBuilder(args);
builder.AddServiceDefaults();
// ... service-specific configuration ...
var app = builder.Build();
app.MapDefaultEndpoints(); // Maps /health/ready and /health/live
// In AppHost
var cosmos = builder.AddAzureCosmosDB("cosmos")
.RunAsEmulator();
var cosmosDb = cosmos.AddDatabase("domain-db");
builder.AddProject<Projects.CosmosQuery>("cosmos-query")
.WithReference(cosmosDb);
| Anti-Pattern | Correct Approach |
|---|---|
| Hardcoded connection strings locally | Use Aspire service discovery |
| Running infrastructure manually | Use Aspire to provision resources |
| Separate observability setup per service | Use ServiceDefaults project |
| Missing health endpoints | Call AddServiceDefaults() + MapDefaultEndpoints() |
# Find AppHost project
find . -name "*AppHost*" -type d
# Find ServiceDefaults
find . -name "*ServiceDefaults*" -type d
# Find Aspire references
grep -r "AddServiceDefaults\|DistributedApplication" --include="*.cs" src/
# Find Aspire packages
grep -r "Aspire" --include="*.csproj" src/
ServiceDefaults project from new servicesAddProject<T> and appropriate referencesdata-ai
Use when about to claim work is complete, fixed, passing, or ready — before committing, creating PRs, or moving to the next task. Requires running verification commands and confirming output before making any success claims.
development
Use when encountering any bug, test failure, build error, or unexpected behavior — before proposing fixes or making changes.
development
Use when checkpointing, wrapping up, or handing off an AI-assisted development session.
development
Use when following the Specification-Driven Development lifecycle from plan through ship.