.NET .NET Aspire formato de manifesto para construtores de ferramentas de implantação
Neste artigo, você aprenderá sobre o formato de manifesto .NET.NET Aspire. Este artigo serve como um guia de referência para construtores de ferramentas de implantação, auxiliando na criação de ferramentas para implantar projetos .NET.NET Aspire em plataformas de hospedagem específicas, seja no local ou na nuvem.
.NET .NET Aspire simplifica a experiência de desenvolvimento local ajudando a gerenciar interdependências entre integrações de aplicativos. Para ajudar a simplificar a implantação de aplicativos, .NET Aspire projetos podem gerar um manifesto de todos os recursos definidos como um arquivo formatado JSON.
Gerar um manifesto
Um projeto de .NET.NET Aspire válido é necessário para gerar um manifesto. Para começar, crie um projeto .NET.NET Aspire usando o modelo de aspire-starter
.NET:
dotnet new aspire-starter --use-redis-cache `
-o AspireApp && `
cd AspireApp
A geração de manifesto é obtida executando dotnet build
com um destino especial:
dotnet run --project AspireApp.AppHost\AspireApp.AppHost.csproj `
--publisher manifest `
--output-path ../aspire-manifest.json
Ponta
O --output-path
dá suporte a caminhos relativos. O comando anterior usa ../aspire-manifest.json
para colocar o arquivo de manifesto na raiz do diretório do projeto.
Para obter mais informações, consulte de execução do dotnet. O comando anterior produz a seguinte saída:
Building...
info: Aspire.Hosting.Publishing.ManifestPublisher[0]
Published manifest to: .\AspireApp.AppHost\aspire-manifest.json
O arquivo gerado é o manifesto .NET.NET Aspire e é usado por ferramentas para dar suporte à implantação em ambientes de nuvem de destino.
Nota
Você também pode gerar um manifesto como parte do perfil de inicialização. Considere o seguinte launchSettings.json:
{
"$schema": "http://json.schemastore.org/launchsettings.json",
"profiles": {
"generate-manifest": {
"commandName": "Project",
"launchBrowser": false,
"dotnetRunMessages": true,
"commandLineArgs": "--publisher manifest --output-path aspire-manifest.json"
}
}
}
Formato de manifesto básico
Publicar o manifesto do modelo inicial padrão para .NET Aspire produz a seguinte saída de JSON:
{
"resources": {
"cache": {
"type": "container.v0",
"connectionString": "{cache.bindings.tcp.host}:{cache.bindings.tcp.port}",
"image": "redis:7.2.4",
"bindings": {
"tcp": {
"scheme": "tcp",
"protocol": "tcp",
"transport": "tcp",
"containerPort": 6379
}
}
},
"apiservice": {
"type": "project.v0",
"path": "../AspireApp.ApiService/AspireApp.ApiService.csproj",
"env": {
"OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EXCEPTION_LOG_ATTRIBUTES": "true",
"OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EVENT_LOG_ATTRIBUTES": "true"
},
"bindings": {
"http": {
"scheme": "http",
"protocol": "tcp",
"transport": "http"
},
"https": {
"scheme": "https",
"protocol": "tcp",
"transport": "http"
}
}
},
"webfrontend": {
"type": "project.v0",
"path": "../AspireApp.Web/AspireApp.Web.csproj",
"env": {
"OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EXCEPTION_LOG_ATTRIBUTES": "true",
"OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EVENT_LOG_ATTRIBUTES": "true",
"ConnectionStrings__cache": "{cache.connectionString}",
"services__apiservice__0": "{apiservice.bindings.http.url}",
"services__apiservice__1": "{apiservice.bindings.https.url}"
},
"bindings": {
"http": {
"scheme": "http",
"protocol": "tcp",
"transport": "http"
},
"https": {
"scheme": "https",
"protocol": "tcp",
"transport": "http"
}
}
}
}
}
O formato de manifesto JSON consiste em um único objeto chamado resources
, que contém uma propriedade para cada recurso especificado em Program.cs (o argumento name
para cada nome é usado como propriedade para cada um dos objetos de recurso filho em JSON).
Referências de cadeia de conexão e associação
No exemplo anterior, há dois recursos de projeto e um recurso de cache Redis. O de webfrontend
Essa dependência é conhecida porque as variáveis de ambiente do webfrontend contêm espaços reservados que fazem referência aos dois outros recursos:
"env": {
// ... other environment variables omitted for clarity
"ConnectionStrings__cache": "{cache.connectionString}",
"services__apiservice__0": "{apiservice.bindings.http.url}",
"services__apiservice__1": "{apiservice.bindings.https.url}"
},
O recurso apiservice
é referenciado por webfrontend
usando a chamada WithReference(apiservice)
no arquivo de host do aplicativo Program.cs e redis
é referenciado usando a chamada WithReference(cache)
:
var builder = DistributedApplication.CreateBuilder(args);
var cache = builder.AddRedis("cache");
var apiService = builder.AddProject<Projects.AspireApp_ApiService>("apiservice");
builder.AddProject<Projects.AspireApp_Web>("webfrontend")
.WithReference(cache)
.WithReference(apiService);
builder.Build().Run();
As referências entre tipos de recursos de projeto resultam em descoberta de serviço variáveis sendo injetadas no projeto de referência. Referências a tipos de referência conhecidos, como Redis resultam na injeção de cadeias de conexão.
Para obter mais informações sobre como os recursos no modelo de aplicativo e as referências entre eles funcionam, consulte .NET.NET Aspire visão geral da orquestração.
Estrutura de cadeia de caracteres de espaço reservado
As cadeias de caracteres de espaço reservado fazem referência à estrutura do manifesto .NET.NET Aspire:
O segmento final da cadeia de caracteres de espaço reservado (url
nesse caso) é gerado pela ferramenta que processa o manifesto. Há vários sufixos que podem ser usados na cadeia de caracteres de espaço reservado:
-
connectionString
: para tipos de recursos conhecidos, como Redis. As ferramentas de implantação traduzem o recurso na infraestrutura mais apropriada para o ambiente de nuvem de destino e produzem uma cadeia de conexão .NET.NET Aspire compatível para o aplicativo consumidor usar. Emcontainer.v0
recursos, o campoconnectionString
pode estar presente e especificado explicitamente. Isso é para dar suporte a cenários em que um tipo de recurso de contêiner é referenciado usando a extensão WithReference, mas deseja ser hospedado explicitamente como um contêiner. -
url
: para referências de serviço a serviço em que uma URL bem formada é necessária. A ferramenta de implantação produz aurl
com base no esquema, protocolo e transporte definidos no manifesto e na topologia de computação/rede subjacente que foi implantada. -
host
: o segmento de host da URL. -
port
: o segmento de porta da URL.
Tipos de recursos
Cada recurso tem um campo type
. Quando uma ferramenta de implantação lê o manifesto, ele deve ler o tipo para verificar se ele pode processar corretamente o manifesto. Durante o período de visualização .NET.NET Aspire, todos os tipos de recursos têm um sufixo v0
para indicar que estão sujeitos a alterações. À medida que .NET.NET Aspire se aproxima, um sufixo v1
será usado para significar que a estrutura do manifesto para esse tipo de recurso deve ser considerada estável (atualizações subsequentes incrementam o número de versão adequadamente).
Campos de recurso comuns
O campo type
é o único campo comum em todos os tipos de recursos, no entanto, os tipos de recursos project.v0
, container.v0
e executable.v0
também compartilham os campos env
e bindings
.
Nota
O tipo de recurso executable.v0
não é totalmente implementado no manifesto devido à sua falta de utilitário em cenários de implantação. Para obter mais informações sobre o contêiner de executáveis, consulte Dockerfile tipos de recursos.
O tipo de campo env
é um mapeamento básico de chave/valor em que os valores podem conter cadeias de caracteres de espaço reservado.
As associações são especificadas no campo bindings
com cada associação contida em seu próprio campo no objeto bindings
JSON. Os campos omitidos pelo manifesto .NET.NET Aspire no nó bindings
incluem:
-
scheme
: um dos seguintes valorestcp
,udp
,http
ouhttps
. -
protocol
: um dos seguintes valorestcp
ouudp
-
transport
: igual ascheme
, mas usado para desambiguar entrehttp
ehttp2
. -
containerPort
: opcional, se omitido padrão para a porta 80.
O campo inputs
Alguns recursos geram um campo inputs
. Esse campo é usado para especificar parâmetros de entrada para o recurso. O campo inputs
é um objeto JSON em que cada propriedade é um parâmetro de entrada usado na resolução da estrutura de espaço reservado. Os recursos que têm um connectionString
, por exemplo, podem usar o campo inputs
para especificar um password
para a cadeia de conexão:
"connectionString": "Host={<resourceName>.bindings.tcp.host};Port={<resourceName>.bindings.tcp.port};Username=admin;Password={<resourceName>.inputs.password};"
O espaço reservado da cadeia de conexão faz referência ao parâmetro de entrada password
do campo inputs
:
"inputs": {
"password": {
"type": "string",
"secret": true,
"default": {
"generate": {
"minLength": 10
}
}
}
}
O snippet de JSON anterior mostra o campo inputs
para um recurso que tem um campo de connectionString
. O parâmetro de entrada password
é um tipo de cadeia de caracteres e é marcado como um segredo. O campo default
é usado para especificar um valor padrão para o parâmetro de entrada. Nesse caso, o valor padrão é gerado usando o campo generate
, com uma cadeia de caracteres aleatória de um comprimento mínimo.
Recursos internos
A tabela a seguir é uma lista de tipos de recursos que são gerados explicitamente por .NET Aspire e extensões desenvolvidas pela equipe de .NET Aspire:
Tipos de recursos independentes de nuvem
Esses recursos estão disponíveis no 📦Aspire. Hospedagem pacote NuGet.
Uso do modelo de aplicativo | Tipo de recurso de manifesto | Link de título |
---|---|---|
AddContainer | container.v0 |
tipo de recurso contêiner |
PublishAsDockerFile |
dockerfile.v0 |
Dockerfile tipos de recursos |
AddDatabase | value.v0 |
MongoDB Server tipos de recursos |
AddMongoDB | container.v0 |
MongoDB tipos de recursos |
AddDatabase | value.v0 |
MySQL Server tipos de recursos |
AddMySql | container.v0 |
MySQL tipos de recursos |
AddDatabase | value.v0 |
Postgres tipos de recursos |
AddPostgres | container.v0 |
Postgres tipos de recursos |
AddProject | project.v0 |
tipo de recurso do Project |
AddRabbitMQ | container.v0 |
RabbitMQ tipos de recursos |
AddRedis | container.v0 |
Redis tipo de recurso |
AddDatabase | value.v0 |
SQL Server tipos de recursos |
AddSqlServer | container.v0 |
SQL Server tipos de recursos |
Tipo de recurso do projeto
Código de exemplo:
var builder = DistributedApplication.CreateBuilder(args);
var apiservice = builder.AddProject<Projects.AspireApp_ApiService>("apiservice");
Manifesto de exemplo:
"apiservice": {
"type": "project.v0",
"path": "../AspireApp.ApiService/AspireApp.ApiService.csproj",
"env": {
"OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EXCEPTION_LOG_ATTRIBUTES": "true",
"OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EVENT_LOG_ATTRIBUTES": "true"
},
"bindings": {
"http": {
"scheme": "http",
"protocol": "tcp",
"transport": "http"
},
"https": {
"scheme": "https",
"protocol": "tcp",
"transport": "http"
}
}
}
Tipo de recurso de contêiner
Código de exemplo:
var builder = DistributedApplication.CreateBuilder(args);
builder.AddContainer("mycontainer", "myimage")
.WithEnvironment("LOG_LEVEL", "WARN")
.WithHttpEndpoint(3000);
Manifesto de exemplo:
{
"resources": {
"mycontainer": {
"type": "container.v0",
"image": "myimage:latest",
"env": {
"LOG_LEVEL": "WARN"
},
"bindings": {
"http": {
"scheme": "http",
"protocol": "tcp",
"transport": "http",
"containerPort": 3000
}
}
}
}
}
Dockerfile tipos de recursos
Código de exemplo:
var builder = DistributedApplication.CreateBuilder(args);
builder.AddNodeApp("nodeapp", "../nodeapp/app.js")
.WithHttpEndpoint(hostPort: 5031, env: "PORT")
.PublishAsDockerFile();
Ponta
A chamada PublishAsDockerFile
é necessária para gerar o tipo de recurso Dockerfile no manifesto e esse método de extensão só está disponível no tipo ExecutableResource.
Manifesto de exemplo:
{
"resources": {
"nodeapp": {
"type": "dockerfile.v0",
"path": "../nodeapp/Dockerfile",
"context": "../nodeapp",
"env": {
"NODE_ENV": "development",
"PORT": "{nodeapp.bindings.http.port}"
},
"bindings": {
"http": {
"scheme": "http",
"protocol": "tcp",
"transport": "http",
"containerPort": 5031
}
}
}
}
}
Postgres tipos de recursos
Código de exemplo:
var builder = DistributedApplication.CreateBuilder(args);
builder.AddPostgres("postgres1")
.AddDatabase("shipping");
Manifesto de exemplo:
{
"resources": {
"postgres1": {
"type": "container.v0",
"connectionString": "Host={postgres1.bindings.tcp.host};Port={postgres1.bindings.tcp.port};Username=postgres;Password={postgres1.inputs.password}",
"image": "postgres:16.2",
"env": {
"POSTGRES_HOST_AUTH_METHOD": "scram-sha-256",
"POSTGRES_INITDB_ARGS": "--auth-host=scram-sha-256 --auth-local=scram-sha-256",
"POSTGRES_PASSWORD": "{postgres1.inputs.password}"
},
"bindings": {
"tcp": {
"scheme": "tcp",
"protocol": "tcp",
"transport": "tcp",
"containerPort": 5432
}
},
"inputs": {
"password": {
"type": "string",
"secret": true,
"default": {
"generate": {
"minLength": 10
}
}
}
}
},
"shipping": {
"type": "value.v0",
"connectionString": "{postgres1.connectionString};Database=shipping"
}
}
}
RabbitMQ tipos de recursos
RabbitMQ é modelado como um recurso de contêiner container.v0
. O exemplo a seguir mostra como eles são adicionados ao modelo de aplicativo.
var builder = DistributedApplication.CreateBuilder(args);
builder.AddRabbitMQ("rabbitmq1");
O código anterior produz o seguinte manifesto:
{
"resources": {
"rabbitmq1": {
"type": "container.v0",
"connectionString": "amqp://guest:{rabbitmq1.inputs.password}@{rabbitmq1.bindings.tcp.host}:{rabbitmq1.bindings.tcp.port}",
"image": "rabbitmq:3",
"env": {
"RABBITMQ_DEFAULT_USER": "guest",
"RABBITMQ_DEFAULT_PASS": "{rabbitmq1.inputs.password}"
},
"bindings": {
"tcp": {
"scheme": "tcp",
"protocol": "tcp",
"transport": "tcp",
"containerPort": 5672
}
},
"inputs": {
"password": {
"type": "string",
"secret": true,
"default": {
"generate": {
"minLength": 10
}
}
}
}
}
}
}
Redis tipo de recurso
Código de exemplo:
var builder = DistributedApplication.CreateBuilder(args);
builder.AddRedis("redis1");
Manifesto de exemplo:
{
"resources": {
"redis1": {
"type": "container.v0",
"connectionString": "{redis1.bindings.tcp.host}:{redis1.bindings.tcp.port}",
"image": "redis:7.2.4",
"bindings": {
"tcp": {
"scheme": "tcp",
"protocol": "tcp",
"transport": "tcp",
"containerPort": 6379
}
}
}
}
}
SQL Server tipos de recursos
Código de exemplo:
var builder = DistributedApplication.CreateBuilder(args);
builder.AddSqlServer("sql1")
.AddDatabase("shipping");
Manifesto de exemplo:
{
"resources": {
"sql1": {
"type": "container.v0",
"connectionString": "Server={sql1.bindings.tcp.host},{sql1.bindings.tcp.port};User ID=sa;Password={sql1.inputs.password};TrustServerCertificate=true",
"image": "mcr.microsoft.com/mssql/server:2022-latest",
"env": {
"ACCEPT_EULA": "Y",
"MSSQL_SA_PASSWORD": "{sql1.inputs.password}"
},
"bindings": {
"tcp": {
"scheme": "tcp",
"protocol": "tcp",
"transport": "tcp",
"containerPort": 1433
}
},
"inputs": {
"password": {
"type": "string",
"secret": true,
"default": {
"generate": {
"minLength": 10
}
}
}
}
},
"shipping": {
"type": "value.v0",
"connectionString": "{sql1.connectionString};Database=shipping"
}
}
}
MongoDB tipos de recursos
Código de exemplo:
var builder = DistributedApplication.CreateBuilder(args);
builder.AddMongoDB("mongodb1")
.AddDatabase("shipping");
Manifesto de exemplo:
{
"resources": {
"mongodb1": {
"type": "container.v0",
"connectionString": "mongodb://{mongodb1.bindings.tcp.host}:{mongodb1.bindings.tcp.port}",
"image": "mongo:7.0.5",
"bindings": {
"tcp": {
"scheme": "tcp",
"protocol": "tcp",
"transport": "tcp",
"containerPort": 27017
}
}
},
"shipping": {
"type": "value.v0",
"connectionString": "{mongodb1.connectionString}/shipping"
}
}
}
MySQL tipos de recursos
Código de exemplo:
var builder = DistributedApplication.CreateBuilder(args);
builder.AddMySql("mysql1")
.AddDatabase("shipping");
Manifesto de exemplo:
{
"resources": {
"mysql1": {
"type": "container.v0",
"connectionString": "Server={mysql1.bindings.tcp.host};Port={mysql1.bindings.tcp.port};User ID=root;Password={mysql1.inputs.password}",
"image": "mysql:8.3.0",
"env": {
"MYSQL_ROOT_PASSWORD": "{mysql1.inputs.password}"
},
"bindings": {
"tcp": {
"scheme": "tcp",
"protocol": "tcp",
"transport": "tcp",
"containerPort": 3306
}
},
"inputs": {
"password": {
"type": "string",
"secret": true,
"default": {
"generate": {
"minLength": 10
}
}
}
}
},
"shipping": {
"type": "value.v0",
"connectionString": "{mysql1.connectionString};Database=shipping"
}
}
}
Azuretipos de recursos específicos
Os recursos a seguir estão disponíveis no 📦Aspire. Hospedagem.Azure pacote NuGet.
Uso do Modelo de Aplicativo | Tipo de recurso de manifesto | Link de título |
---|---|---|
AddAzureAppConfiguration | azure.bicep.v0 |
Azure tipos de recurso de Configuração de Aplicativo |
AddAzureKeyVault | azure.bicep.v0 |
Azure Key Vault tipo de recurso |
AddAzureRedis |
azure.bicep.v0 |
Azure Redis tipos de recursos |
AddAzureServiceBus | azure.bicep.v0 |
Azure Service Bus tipo de recurso |
AddAzureSqlServer(...) |
azure.bicep.v0 |
Azure tipos de recursos SQL |
AddAzureSqlServer(...).AddDatabase(...) |
value.v0 |
Azure tipos de recursos SQL |
AddAzurePostgresFlexibleServer(...) |
azure.bicep.v0 |
Azure Postgres tipos de recursos |
AddAzurePostgresFlexibleServer(...).AddDatabase(...) |
value.v0 |
Azure Postgres tipos de recursos |
AddAzureStorage | azure.storage.v0 |
Azure tipos de recursos de armazenamento |
AddBlobs | value.v0 |
Azure tipos de recursos de armazenamento |
AddQueues | value.v0 |
Azure tipos de recursos de armazenamento |
AddTables | value.v0 |
Azure tipos de recursos de armazenamento |
Azure Key Vault tipo de recurso
Código de exemplo:
var builder = DistributedApplication.CreateBuilder(args);
builder.AddAzureKeyVault("keyvault1");
Manifesto de exemplo:
{
"resources": {
"keyvault1": {
"type": "azure.bicep.v0",
"connectionString": "{keyvault1.outputs.vaultUri}",
"path": "aspire.hosting.azure.bicep.keyvault.bicep",
"params": {
"principalId": "",
"principalType": "",
"vaultName": "keyvault1"
}
}
}
}
Azure Service Bus tipo de recurso
Código de exemplo:
var builder = DistributedApplication.CreateBuilder(args);
builder.AddAzureServiceBus("sb1")
.AddTopic("topic1", [])
.AddTopic("topic2", [])
.AddQueue("queue1")
.AddQueue("queue2");
Manifesto de exemplo:
{
"resources": {
"sb1": {
"type": "azure.bicep.v0",
"connectionString": "{sb1.outputs.serviceBusEndpoint}",
"path": "aspire.hosting.azure.bicep.servicebus.bicep",
"params": {
"serviceBusNamespaceName": "sb1",
"principalId": "",
"principalType": "",
"queues": [
"queue1",
"queue2"
],
"topics": [
{
"name": "topic1",
"subscriptions": []
},
{
"name": "topic2",
"subscriptions": []
}
]
}
}
}
}
tipos de recursos de armazenamento Azure
Código de exemplo:
var builder = DistributedApplication.CreateBuilder(args);
var storage = builder.AddAzureStorage("images");
storage.AddBlobs("blobs");
storage.AddQueues("queues");
storage.AddTables("tables");
Manifesto de exemplo:
{
"resources": {
"images": {
"type": "azure.bicep.v0",
"path": "aspire.hosting.azure.bicep.storage.bicep",
"params": {
"principalId": "",
"principalType": "",
"storageName": "images"
}
},
"blobs": {
"type": "value.v0",
"connectionString": "{images.outputs.blobEndpoint}"
},
"queues": {
"type": "value.v0",
"connectionString": "{images.outputs.queueEndpoint}"
},
"tables": {
"type": "value.v0",
"connectionString": "{images.outputs.tableEndpoint}"
}
}
}
Azure Redis tipo de recurso
Código de exemplo:
var builder = DistributedApplication.CreateBuilder(args);
builder.AddAzureRedis("azredis1");
Manifesto de exemplo:
{
"resources": {
"azredis": {
"type": "azure.bicep.v0",
"connectionString": "{azredis.outputs.connectionString}",
"path": "azredis.module.bicep",
"params": {
"principalId": "",
"principalName": ""
}
}
}
}
Azure tipo de recurso de Configuração de Aplicativo
Código de exemplo:
var builder = DistributedApplication.CreateBuilder(args);
builder.AddAzureAppConfiguration("appconfig1");
Manifesto de exemplo:
{
"resources": {
"appconfig1": {
"type": "azure.bicep.v0",
"connectionString": "{appconfig1.outputs.appConfigEndpoint}",
"path": "aspire.hosting.azure.bicep.appconfig.bicep",
"params": {
"configName": "appconfig1",
"principalId": "",
"principalType": ""
}
}
}
}
Azure tipos de recursos SQL
Código de exemplo:
var builder = DistributedApplication.CreateBuilder(args);
builder.AddAzureSqlServer("sql")
.AddDatabase("inventory");
Manifesto de exemplo:
{
"resources": {
"sql": {
"type": "azure.bicep.v0",
"connectionString": "Server=tcp:{sql.outputs.sqlServerFqdn},1433;Encrypt=True;Authentication=\u0022Active Directory Default\u0022",
"path": "sql.module.bicep",
"params": {
"principalId": "",
"principalName": ""
}
},
"inventory": {
"type": "value.v0",
"connectionString": "{sql.connectionString};Database=inventory"
}
}
}
Azure Postgres tipos de recursos
Código de exemplo:
var builder = DistributedApplication.CreateBuilder(args);
builder.AddAzurePostgresFlexibleServer("postgres")
.AddDatabase("db");
Manifesto de exemplo:
{
"resources": {
"postgres": {
"type": "azure.bicep.v0",
"connectionString": "{postgres.outputs.connectionString}",
"path": "postgres.module.bicep",
"params": {
"principalId": "",
"principalType": "",
"principalName": ""
}
},
"db": {
"type": "value.v0",
"connectionString": "{postgres.connectionString};Database=db"
}
}
}
Tipos de recursos com suporte no Azure Developer CLI
O Azure Developer CLI (azd) é uma ferramenta que pode ser usada para implantar projetos .NET Aspire para Azure Container Apps. Com o tipo de recurso azure.bicep.v0
, os tipos de contêiner de recursos independentes de nuvem podem ser mapeados para Azurerecursos específicos. A tabela a seguir lista os tipos de recursos com suporte no Azure Developer CLI:
Nome | API independente de nuvem | API de Azure |
---|---|---|
Redis | AddRedis | AddAzureRedis |
Postgres | AddPostgres | AddAzurePostgresFlexibleServer |
SQL Server | AddSqlServer | AddAzureSqlServer |
Quando recursos configurados como Azure recursos, o tipo de recurso azure.bicep.v0
é gerado no manifesto. Para obter mais informações, consulte Implantar um projeto de .NET Aspire para Azure Container Apps usando o Azure Developer CLI (guia detalhado).
Consulte também
- visão geral .NET.NET Aspire
- .NET .NET Aspire visão geral da orquestração
- visão geral das integrações .NET.NET Aspire
- Descoberta do Serviço no .NET.NET Aspire