In this exercise, I focused on only one Azure resource: Azure Cosmos DB. My goal was simple: run Cosmos locally, connect a console client project to it through .NET Aspire, create database/container automatically, and write a test item end-to-end.
How it looks like
This is the Data Explorer emulator with a item
This is the ASPIRE project
How I wired Cosmos in Aspire AppHost
In AzureEmulators/AppHost.cs, I added Cosmos DB as a preview emulator and enabled Data Explorer. Then I defined:
- Database:
CosmosDatabase1 - Container:
CosmosEntriesContainer1with partition key/id - Client project reference:
cosmosClient1withWithReference(container)andWaitFor(container)
#pragma warning disable ASPIRECOSMOSDB001
var cosmos = builder.AddAzureCosmosDB("cosmos-db1")
.RunAsPreviewEmulator(emulator =>
{ emulator.WithDataExplorer();
});
var dbCosmos = cosmos.AddCosmosDatabase("CosmosDatabase1");
var container = dbCosmos.AddContainer("CosmosEntriesContainer1", "/id");
var csm = builder
.AddProject<Projects.CosmosClient>("cosmosClient1")
.WithReference(container)
.WaitFor(container)
;
What my CosmosClient project does
In CosmosClient/Program.cs, I implemented a small startup flow to validate connectivity and prove writes work.
- I scan environment variables and pick the Cosmos connection string.
- I fail fast if the connection string is missing.
- I create a Cosmos client configured for local emulator-friendly access:
ConnectionMode = GatewayLimitToEndpoint = true
- I call
CreateDatabaseIfNotExistsAsync("CosmosDatabase1"). - I call
CreateContainerIfNotExistsAsync("CosmosEntriesContainer1", "/id"). - I insert one item with a generated GUID id and name
"Andrei Ignat".
Code from my console client project
using Azure.Core;
using Microsoft.Azure.Cosmos;
using Microsoft.Azure.Cosmos.Fluent;
using System.Collections;
using System.Net;
Console.WriteLine("Hello, Cosmos Client!");
string connectionStringCosmos = "";
foreach (var item in Environment.GetEnvironmentVariables().Cast<DictionaryEntry>())
{
if(item.Key?.ToString()?.Contains("Cosmos") == true)
{
Console.WriteLine($"{item.Key}: {item.Value}");
connectionStringCosmos = item.Value?.ToString() ?? string.Empty;
}
}
if(string.IsNullOrWhiteSpace(connectionStringCosmos))
{
Console.WriteLine("Cosmos connection string is not set in environment variables.");
return;
}
CosmosClientBuilder builder = new CosmosClientBuilder(connectionStringCosmos);
CosmosClient client = new CosmosClient(connectionStringCosmos, new CosmosClientOptions
{
ConnectionMode = ConnectionMode.Gateway,
LimitToEndpoint = true
});
Console.WriteLine("CosmosClient created successfully. Attempting to connect to database...");
DatabaseResponse response = await client.CreateDatabaseIfNotExistsAsync(
id: "CosmosDatabase1"
);
Database database = response.Database;
Console.WriteLine("Database created successfully. Attempting to connect to container...");
var containerResponse = await database.CreateContainerIfNotExistsAsync(
id: "CosmosEntriesContainer1",
partitionKeyPath: "/id"
);
var container = containerResponse.Container;
Console.WriteLine("start write item to CosmosDB");
await container.CreateItemAsync(new { id = Guid.NewGuid().ToString(), name = "Andrei Ignat" });
Console.WriteLine("verify with Explorer that I wrote the item to CosmosDB");
Output logs from my client project
Waiting for resource 'cosmos-db1' to enter the 'Running' state.
Waiting for resource 'CosmosDatabase1' to enter the 'Running' state.
Waiting for resource 'CosmosEntriesContainer1' to enter the 'Running' state.
Waiting for resource ready to execute for 'CosmosEntriesContainer1'.
Waiting for resource ready to execute for 'CosmosDatabase1'.
Waiting for resource 'cosmos-db1' to become healthy.
Waiting for resource ready to execute for 'cosmos-db1'.
Finished waiting for resource 'CosmosEntriesContainer1'.
Finished waiting for resource 'CosmosDatabase1'.
Finished waiting for resource 'cosmos-db1'.
[sys] Starting process...: Cmd = C:\Program Files\dotnet\dotnet.exe, Args = ["watch", "--non-interactive", "--no-hot-reload", "--project", "D:\\eu\\GitHub\\aspireExtensions\\src\\samples\\13.4\\AzureEmulators\\CosmosClient\\CosmosClient.csproj", "--configuration", "Debug", "--no-launch-profile"]
dotnet watch ⌚ Waiting for changes
Hello, Cosmos Client!
ConnectionStrings__CosmosEntriesContainer1: AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==;AccountEndpoint=https://localhost:60173;Database=CosmosDatabase1;Container=CosmosEntriesContainer1
CosmosClient created successfully. Attempting to connect to database...
Database created successfully. Attempting to connect to container...
start write item to CosmosDB
verify with Explorer that I wrote the item to CosmosDB
dotnet watch ⌚ Exited
dotnet watch ⏳ Waiting for a file to change before restarting ...
What is achieved
- I can run Cosmos DB on my local PC without provisioning a cloud resource.
- I get automatic resource initialization (database + container) from code.
- I proved write operations by inserting a document from the client project.
- I can verify data immediately using the emulator Data Explorer UI.
- I have a repeatable local dev loop for Cosmos: run, connect, create-if-missing, write, verify.
More links
https://github.com/ignatandrei/aspireExtensions/tree/main/src/samples/13.4/AzureEmulators
https://aspire.dev/integrations/cloud/azure/azure-cosmos-db/azure-cosmos-db-get-started/
https://aspire.dev/integrations/databases/efcore/azure-cosmos-db/azure-cosmos-db-host/