Bagikan melalui


gambaran umum orkestrasi .NET.NET Aspire

.NET .NET Aspire menyediakan API untuk mengekspresikan sumber daya dan dependensi dalam aplikasi terdistribusi Anda. Selain API ini, ada alat yang memungkinkan beberapa skenario menarik. Orkestrator ditujukan untuk pengembangan lokal dan tidak didukung di lingkungan produksi.

Sebelum melanjutkan, pertimbangkan beberapa terminologi umum yang digunakan dalam .NET.NET Aspire:

  • Model aplikasi: Kumpulan sumber daya yang membentuk aplikasi terdistribusi Anda (DistributedApplication), yang ditentukan dalam namespace Aspire.Hosting.ApplicationModel. Untuk definisi yang lebih formal, lihat Menentukan model aplikasi.
  • Proyek pengelola aplikasi/Orkestrator: Proyek .NET yang mengatur model aplikasi , dinamai dengan akhiran *.AppHost (sesuai konvensi).
  • Resource: sumber daya adalah bagian dependen dari aplikasi, seperti proyek .NET, kontainer, executable, database, cache, atau layanan cloud. Ini mewakili bagian mana pun dari aplikasi yang dapat dikelola atau dirujuk.
  • Integration: Integrasi adalah paket NuGet untuk pengelola aplikasi yang memodelkan sumber daya atau paket yang mengonfigurasi klien untuk digunakan dalam aplikasi pengguna. Untuk informasi selengkapnya, lihat gambaran umum integrasi .NET.NET Aspire.
  • Referensi: Referensi mendefinisikan koneksi antara sumber daya, yang dinyatakan sebagai dependensi menggunakan API WithReference. Untuk informasi selengkapnya, lihat Sumber daya Referensi atau Referensi sumber daya yang ada.

Nota

.NET .NET AspireOrkestrasi ini dirancang untuk meningkatkan pengalaman pengembangan lokal Anda dengan menyederhanakan pengelolaan konfigurasi dan interkoneksi aplikasi cloud-native Anda. Meskipun ini adalah alat yang sangat berharga untuk pengembangan, ini tidak dimaksudkan untuk mengganti sistem lingkungan produksi seperti Kubernetes, yang dirancang khusus untuk unggul dalam konteks tersebut.

Menentukan model aplikasi

.NET .NET Aspire memberdayakan Anda untuk membangun, menyediakan, menyebarkan, mengonfigurasi, menguji, menjalankan, dan mengamati aplikasi terdistribusi dengan mulus. Semua kemampuan ini dicapai melalui pemanfaatan model aplikasi yang menguraikan sumber daya dalam solusi .NET.NET Aspire Anda dan hubungannya. Sumber daya ini mencakup proyek, executable, kontainer, dan layanan eksternal dan sumber daya cloud yang bergantung pada aplikasi Anda. Dalam setiap solusi .NET.NET Aspire, ada proyek host aplikasi yang ditunjuk, di mana model aplikasi didefinisikan dengan tepat menggunakan metode yang tersedia di IDistributedApplicationBuilder. Penyusun ini diperoleh dengan memanggil DistributedApplication.CreateBuilder.

// Create a new app model builder
var builder = DistributedApplication.CreateBuilder(args);

// TODO:
//   Add resources to the app model
//   Express dependencies between resources

builder.Build().Run();

Proyek host aplikasi

Proyek host aplikasi menangani menjalankan semua proyek yang merupakan bagian dari proyek .NET.NET Aspire. Dengan kata lain, ia bertanggung jawab untuk mengatur semua aplikasi dalam model aplikasi. Proyek itu sendiri adalah proyek yang dapat dieksekusi .NET yang mereferensikan 📦Aspirepaket NuGet Hosting.AppHost, mengatur properti IsAspireHost menjadi true, dan mereferensikan SDK .NET.NET Aspire:

<Project Sdk="Microsoft.NET.Sdk">

    <Sdk Name="Aspire.AppHost.Sdk" Version="9.1.0" />
    
    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net9.0</TargetFramework>
        <IsAspireHost>true</IsAspireHost>
        <!-- Omitted for brevity -->
    </PropertyGroup>

    <ItemGroup>
        <PackageReference Include="Aspire.Hosting.AppHost" Version="9.1.0" />
    </ItemGroup>

    <!-- Omitted for brevity -->

</Project>

Kode berikut menjelaskan aplikasi host Program dengan referensi dua proyek dan cache Redis.

var builder = DistributedApplication.CreateBuilder(args);

var cache = builder.AddRedis("cache");

var apiservice = builder.AddProject<Projects.AspireApp_ApiService>("apiservice");

builder.AddProject<Projects.AspireApp_Web>("webfrontend")
       .WithExternalHttpEndpoints()
       .WithReference(cache)
       .WaitFor(cache)
       .WithReference(apiService)
       .WaitFor(apiService);

builder.Build().Run();

Kode sebelumnya:

  • Membuat pembuat model aplikasi baru menggunakan metode CreateBuilder.
  • Menambahkan sumber daya Rediscache bernama "cache" menggunakan metode AddRedis.
  • Menambahkan sumber daya proyek bernama "apiservice" menggunakan metode AddProject.
  • Menambahkan sumber daya proyek bernama "webfrontend" menggunakan metode AddProject.
    • Menentukan bahwa proyek memiliki titik akhir HTTP eksternal menggunakan metode WithExternalHttpEndpoints.
    • Menambahkan referensi ke sumber daya cache dan menunggunya siap menggunakan metode WithReference dan WaitFor.
    • Menambahkan referensi ke sumber daya apiservice dan menunggunya siap menggunakan metode WithReference dan WaitFor.
  • Membangun dan menjalankan model aplikasi menggunakan metode Build dan Run.

Contoh kode menggunakan integrasi hosting .NET AspireRedis.

Untuk membantu memvisualisasikan hubungan antara proyek host aplikasi dan sumber daya yang dijelaskannya, pertimbangkan diagram berikut:

Hubungan antara proyek dalam templat Aplikasi Pemula .NET.NET Aspire.

Setiap sumber daya harus diberi nama unik. Diagram ini memperlihatkan setiap sumber daya dan hubungan di antaranya. Sumber daya kontainer diberi nama "cache" dan sumber daya proyek diberi nama "apiservice" dan "webfrontend". Proyek frontend web mereferensikan cache dan proyek layanan API. Saat Anda mengekspresikan referensi dengan cara ini, proyek frontend web mengatakan bahwa itu tergantung pada kedua sumber daya ini, masing-masing "cache" dan "apiservice".

Jenis sumber daya bawaan

.NET .NET Aspire proyek terdiri dari sekumpulan sumber daya. Jenis sumber daya dasar utama di 📦Aspire. Hosting.AppHost paket NuGet dijelaskan dalam tabel berikut:

Metode Jenis sumber daya Deskripsi
AddProject ProjectResource Proyek .NET, misalnya, aplikasi web ASP.NET Core.
AddContainer ContainerResource Gambar kontainer, seperti gambar Docker.
AddExecutable ExecutableResource File yang dapat dieksekusi, seperti aplikasi Node.js.
AddParameter ParameterResource Sumber daya parameter yang dapat digunakan untuk mengekspresikan parameter eksternal.

Sumber daya proyek mewakili proyek .NET yang merupakan bagian dari model aplikasi. Saat Anda menambahkan referensi proyek ke proyek host aplikasi, .NET.NET Aspire SDK menghasilkan jenis di namespace Projects untuk setiap proyek yang dirujuk. Untuk informasi selengkapnya, lihat .NET.NET Aspire SDK: Referensi proyek.

Untuk menambahkan proyek ke model aplikasi, gunakan metode AddProject:

var builder = DistributedApplication.CreateBuilder(args);

// Adds the project "apiservice" of type "Projects.AspireApp_ApiService".
var apiservice = builder.AddProject<Projects.AspireApp_ApiService>("apiservice");

Proyek dapat direplikasi dan diskalakan dengan menambahkan beberapa instans proyek yang sama ke model aplikasi. Untuk mengonfigurasi replika, gunakan metode WithReplicas:

var builder = DistributedApplication.CreateBuilder(args);

// Adds the project "apiservice" of type "Projects.AspireApp_ApiService".
var apiservice = builder.AddProject<Projects.AspireApp_ApiService>("apiservice")
                        .WithReplicas(3);

Kode sebelumnya menambahkan tiga replika sumber daya proyek "apiservice" ke model aplikasi. Untuk informasi selengkapnya, lihat dasbor .NET.NET Aspire: Replika sumber daya.

Mengonfigurasi mulai sumber daya eksplisit

Sumber daya proyek, sumber daya yang dapat dijalankan, dan kontainer secara otomatis dimulai bersama dengan aplikasi terdistribusi Anda secara default. Sumber daya dapat dikonfigurasi untuk menunggu instruksi startup eksplisit dengan metode WithExplicitStart. Sumber daya yang dikonfigurasi dengan WithExplicitStart diinisialisasi dengan KnownResourceStates.NotStarted.

var builder = DistributedApplication.CreateBuilder(args);

var postgres = builder.AddPostgres("postgres");
var postgresdb = postgres.AddDatabase("postgresdb");

builder.AddProject<Projects.AspireApp_DbMigration>("dbmigration")
       .WithReference(postgresdb)
       .WithExplicitStart();

Dalam kode sebelumnya, sumber daya "dbmigration" dikonfigurasi untuk tidak dimulai secara otomatis dengan aplikasi terdistribusi.

Sumber daya yang memiliki opsi mulai eksplisit dapat diaktifkan dari dasbor .NET.NET Aspire dengan mengklik perintah "Mulai". Untuk informasi selengkapnya, lihat dasbor .NET.NET Aspire: Menghentikan atau Memulai sumber daya.

Sumber daya referensi

Referensi mewakili dependensi antara sumber daya. Misalnya, Anda mungkin dapat membayangkan skenario di mana Anda frontend web bergantung pada cache Redis. Pertimbangkan contoh kode C# aplikasi host Program berikut:

var builder = DistributedApplication.CreateBuilder(args);

var cache = builder.AddRedis("cache");

builder.AddProject<Projects.AspireApp_Web>("webfrontend")
       .WithReference(cache);

Sumber daya proyek "webfrontend" menggunakan WithReference untuk menambahkan dependensi pada sumber daya kontainer "cache". Dependensi ini dapat mewakili string koneksi atau informasi penemuan layanan . Dalam contoh sebelumnya, variabel lingkungan disuntikkan ke sumber daya "webfrontend" dengan nama ConnectionStrings__cache. Variabel lingkungan ini berisi string koneksi yang digunakan webfrontend dalam menghubungkan ke Redis melalui integrasi .NET AspireRedis, misalnya, ConnectionStrings__cache="localhost:62354".

Menunggu sumber daya

Dalam beberapa kasus, Anda mungkin ingin menunggu sumber daya siap sebelum memulai sumber daya lain. Misalnya, Anda mungkin ingin menunggu database siap sebelum memulai API yang bergantung padanya. Untuk mengekspresikan dependensi ini, gunakan metode WaitFor:

var builder = DistributedApplication.CreateBuilder(args);

var postgres = builder.AddPostgres("postgres");
var postgresdb = postgres.AddDatabase("postgresdb");

builder.AddProject<Projects.AspireApp_ApiService>("apiservice")
       .WithReference(postgresdb)
       .WaitFor(postgresdb);

Dalam kode sebelumnya, sumber daya proyek "apiservice" menunggu sumber daya database "postgresdb" memasuki KnownResourceStates.Running. Contoh kode menunjukkan integrasi .NET AspirePostgreSQL, tetapi pola yang sama dapat diterapkan ke sumber daya lain.

Kasus lain mungkin memerlukan menunggu sumber daya berjalan sampai selesai, baik KnownResourceStates.Exited atau KnownResourceStates.Finished, sebelum sumber daya dependen dimulai. Untuk menunggu sumber daya berjalan hingga selesai, gunakan metode WaitForCompletion:

var builder = DistributedApplication.CreateBuilder(args);

var postgres = builder.AddPostgres("postgres");
var postgresdb = postgres.AddDatabase("postgresdb");

var migration = builder.AddProject<Projects.AspireApp_Migration>("migration")
                       .WithReference(postgresdb)
                       .WaitFor(postgresdb);

builder.AddProject<Projects.AspireApp_ApiService>("apiservice")
       .WithReference(postgresdb)
       .WaitForCompletion(migration);

Dalam kode sebelumnya, sumber daya proyek "apiservice" menunggu sumber daya proyek "migrasi" berjalan hingga selesai sebelum memulai. Sumber daya proyek "migrasi" menunggu sumber daya database "postgresdb" untuk memasuki status KnownResourceStates.Running. Ini dapat berguna dalam skenario di mana Anda ingin menjalankan migrasi database sebelum memulai layanan API, misalnya.

Memaksa memulai sumber daya di dasbor

Menunggu sumber dapat dilewati dengan perintah "Mulai" di dasbor. Mengklik "Mulai" pada sumber daya yang menunggu di dasbor memberikan instruksi untuk segera memulai tanpa menunggu sumber daya menjadi sehat atau selesai. Ini dapat berguna ketika Anda ingin segera menguji sumber daya dan tidak ingin menunggu aplikasi berada dalam status yang tepat.

API untuk menambahkan dan mengekspresikan sumber daya

.NET .NET Aspire integrasi hosting dan integrasi klien keduanya dikirimkan sebagai paket NuGet, tetapi melayani tujuan yang berbeda. Meskipun integrasi klien menyediakan konfigurasi pustaka klien untuk menggunakan aplikasi di luar cakupan host aplikasi, integrasi hosting menyediakan API untuk mengekspresikan sumber daya dan dependensi dalam host aplikasi. Untuk informasi selengkapnya, lihat gambaran umum integrasi .NET.NET Aspire: Tanggung jawab integrasi.

Sumber daya kontainer ekspres

Untuk mengekspresikan ContainerResource Anda menambahkannya ke instans IDistributedApplicationBuilder dengan memanggil metode AddContainer:

var builder = DistributedApplication.CreateBuilder(args);

var ollama = builder.AddContainer("ollama", "ollama/ollama")
    .WithBindMount("ollama", "/root/.ollama")
    .WithBindMount("./ollamaconfig", "/usr/config")
    .WithHttpEndpoint(port: 11434, targetPort: 11434, name: "ollama")
    .WithEntrypoint("/usr/config/entrypoint.sh")
    .WithContainerRuntimeArgs("--gpus=all");

Untuk informasi selengkapnya, lihat dukungan GPU di Docker Desktop.

Kode sebelumnya menambahkan sumber daya kontainer bernama "ollama" dengan gambar ollama/ollama. Sumber daya kontainer dikonfigurasi dengan beberapa pemasangan pengikat, titik akhir HTTP bernama, titik masuk yang merujuk ke skrip shell Unix, dan argumen saat menjalankan kontainer dengan metode WithContainerRuntimeArgs.

Menyesuaikan sumber daya kontainer

Semua subkelas ContainerResource dapat disesuaikan untuk memenuhi persyaratan spesifik Anda. Ini dapat berguna saat menggunakan integrasi hosting yang memodelkan sumber daya kontainer, tetapi memerlukan modifikasi. Ketika Anda memiliki IResourceBuilder<ContainerResource> Anda dapat menautkan panggilan ke salah satu API yang tersedia untuk memodifikasi sumber daya kontainer. .NET .NET Aspire sumber daya kontainer biasanya menunjuk ke tag yang disematkan, tetapi Anda mungkin ingin menggunakan tag latest sebagai alternatif.

Untuk membantu mencontohkan hal ini, bayangkan skenario di mana Anda menggunakan integrasi .NET AspireRedis. Jika integrasi Redis bergantung pada tag 7.4 dan Anda ingin menggunakan tag latest sebagai gantinya, Anda dapat menautkan panggilan ke API WithImageTag:

var builder = DistributedApplication.CreateBuilder(args);

var cache = builder.AddRedis("cache")
                   .WithImageTag("latest");

// Instead of using the "7.4" tag, the "cache" 
// container resource now uses the "latest" tag.

Untuk informasi selengkapnya dan API tambahan yang tersedia, lihat ContainerResourceBuilderExtensions.

Siklus hidup sumber daya kontainer

Saat host aplikasi dijalankan, ContainerResource digunakan untuk menentukan gambar kontainer apa yang akan dibuat dan dimulai. Di balik layar, .NET Aspire menjalankan kontainer menggunakan citra kontainer yang ditentukan dengan mendelegasikan panggilan ke runtime kontainer yang sesuai dengan OCI, entah Docker atau Podman. Perintah berikut digunakan:

Pertama, kontainer dibuat menggunakan perintah docker container create. Kemudian, wadah dijalankan menggunakan perintah docker container start.

Perintah ini digunakan alih-alih docker run untuk mengelola jaringan, volume, dan port kontainer yang terpasang. Memanggil perintah ini dalam urutan ini memungkinkan IP (konfigurasi jaringan) apa pun sudah ada saat startup awal.

Di luar jenis sumber daya dasar, ProjectResource, ContainerResource, dan ExecutableResource, .NET.NET Aspire menyediakan metode ekstensi untuk menambahkan sumber daya umum ke model aplikasi Anda. Untuk informasi selengkapnya, lihat integrasi hosting .

Masa pakai sumber daya kontainer

Secara default, sumber daya kontainer menggunakan masa pakai kontainer session. Ini berarti bahwa setiap kali proses host aplikasi dimulai, kontainer dibuat dan dimulai. Saat host aplikasi berhenti, kontainer dihentikan dan dihapus. Sumber daya kontainer dapat memilih masa pakai persisten untuk mencegah restart yang tidak perlu dan menggunakan status kontainer yang telah dipertahankan. Untuk mencapai hal ini, rantai panggilan API ContainerResourceBuilderExtensions.WithLifetime dan teruskan ContainerLifetime.Persistent:

var builder = DistributedApplication.CreateBuilder(args);

var ollama = builder.AddContainer("ollama", "ollama/ollama")
    .WithLifetime(ContainerLifetime.Persistent);

Kode sebelumnya menambahkan sumber daya kontainer bernama "ollama" dengan gambar "ollama/ollama" dan masa pakai persisten.

String koneksi dan referensi titik akhir

Umum untuk mengekspresikan dependensi antara sumber daya proyek. Pertimbangkan contoh kode berikut:

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);

Referensi proyek-ke-proyek ditangani secara berbeda dari sumber daya yang memiliki string koneksi yang terdefinisi dengan baik. Alih-alih string koneksi disuntikkan ke sumber daya "webfrontend", variabel lingkungan untuk mendukung penemuan layanan disuntikkan.

Metode Variabel lingkungan
WithReference(cache) ConnectionStrings__cache="localhost:62354"
WithReference(apiservice) services__apiservice__http__0="http://localhost:5455"
services__apiservice__https__0="https://localhost:7356"

Menambahkan referensi ke proyek "apiservice" menghasilkan variabel lingkungan penemuan layanan yang ditambahkan ke frontend. Ini karena biasanya, komunikasi proyek-ke-proyek terjadi melalui HTTP/gRPC. Untuk informasi selengkapnya, lihat penemuan layanan .NET.NET Aspire.

Untuk mendapatkan titik akhir tertentu dari ContainerResource atau ExecutableResource, gunakan salah satu API titik akhir berikut:

Kemudian panggil API GetEndpoint untuk mendapatkan titik akhir yang dapat digunakan untuk mereferensikan titik akhir dalam metode WithReference:

var builder = DistributedApplication.CreateBuilder(args);

var customContainer = builder.AddContainer("myapp", "mycustomcontainer")
                             .WithHttpEndpoint(port: 9043, name: "endpoint");

var endpoint = customContainer.GetEndpoint("endpoint");

var apiservice = builder.AddProject<Projects.AspireApp_ApiService>("apiservice")
                        .WithReference(endpoint);
Metode Variabel lingkungan
WithReference(endpoint) services__myapp__endpoint__0=https://localhost:9043

Parameter port adalah port yang digunakan oleh kontainer untuk mendengarkan. Untuk informasi selengkapnya tentang pelabuhan kontainer, lihat pelabuhan kontainer. Untuk informasi selengkapnya tentang penemuan layanan, lihat penemuan layanan .NET.NET Aspire.

Format variabel lingkungan titik akhir layanan

Di bagian sebelumnya, metode WithReference digunakan untuk mengekspresikan dependensi antar sumber daya. Ketika titik akhir layanan mengakibatkan variabel lingkungan disuntikkan ke dalam sumber daya dependen, formatnya mungkin tidak jelas. Bagian ini menyediakan detail tentang format ini.

Ketika satu sumber daya bergantung pada sumber daya lain, host aplikasi menyuntikkan variabel lingkungan ke dalam sumber daya dependen. Variabel lingkungan ini mengonfigurasi sumber daya dependen untuk terhubung ke sumber daya yang bergantung padanya. Format variabel lingkungan khusus untuk .NET.NET Aspire dan mengekspresikan titik akhir layanan dengan cara yang kompatibel dengan Service Discovery.

Nama variabel lingkungan titik akhir layanan diawali dengan services__ (garis bawah ganda), lalu nama layanan, nama titik akhir, dan akhirnya indeks. Indeks mendukung beberapa titik akhir untuk satu layanan, dimulai dengan 0 untuk titik akhir pertama dan bertahap untuk setiap titik akhir.

Pertimbangkan contoh variabel lingkungan berikut:

services__apiservice__http__0

Variabel lingkungan sebelumnya mengekspresikan titik akhir HTTP pertama untuk layanan apiservice. Nilai variabel lingkungan adalah URL titik akhir layanan. Titik akhir bernama mungkin dinyatakan sebagai berikut:

services__apiservice__myendpoint__0

Dalam contoh sebelumnya, layanan apiservice memiliki titik akhir bernama yang disebut myendpoint. Nilai variabel lingkungan adalah URL titik akhir layanan.

Mereferensikan sumber daya yang ada

Dalam beberapa situasi, Anda perlu merujuk pada sumber daya yang ada, mungkin yang telah diterapkan pada penyedia cloud. Misalnya, Anda mungkin ingin mereferensikan database Azure. Dalam hal ini, Anda akan mengandalkan konteks eksekusi untuk menentukan secara dinamis apakah host aplikasi berjalan dalam mode "jalankan" atau mode "terbitkan". Jika Anda menjalankan secara lokal dan ingin mengandalkan sumber daya cloud, Anda dapat menggunakan properti IsRunMode untuk menambahkan referensi secara kondisional. Anda dapat memilih untuk membuat sumber daya dalam mode publikasi. Beberapa integrasi hosting mendukung penyediaan string koneksi secara langsung, yang dapat digunakan untuk mereferensikan sumber daya yang ada.

Demikian juga, mungkin ada kasus penggunaan di mana Anda ingin mengintegrasikan .NET.NET Aspire ke dalam solusi yang ada. Salah satu pendekatan umum adalah menambahkan proyek host aplikasi .NET.NET Aspire ke solusi yang ada. Dalam host aplikasi, Anda mengekspresikan dependensi dengan menambahkan referensi proyek ke host aplikasi dan membangun model aplikasi. Misalnya, satu proyek mungkin bergantung pada proyek lain. Dependensi ini dinyatakan menggunakan metode WithReference. Untuk informasi selengkapnya, lihat Tambah .NET Aspire ke aplikasi .NET yang ada.

Siklus hidup host aplikasi

Host aplikasi .NET.NET Aspire memaparkan beberapa siklus hidup yang dapat Anda kaitkan dengan menerapkan antarmuka IDistributedApplicationLifecycleHook. Metode siklus hidup berikut tersedia:

Pesanan Metode Deskripsi
1 BeforeStartAsync Dijalankan sebelum aplikasi terdistribusi dimulai.
2 AfterEndpointsAllocatedAsync Dijalankan setelah orkestrator mengalokasikan titik akhir untuk sumber daya dalam model aplikasi.
3 AfterResourcesCreatedAsync Dijalankan setelah sumber daya dibuat oleh orkestrator.

Meskipun host aplikasi menyediakan kait siklus hidup, Anda mungkin ingin mendaftarkan peristiwa kustom. Untuk informasi selengkapnya, lihat peristiwa di .NET.NET Aspire.

Mendaftarkan pengait siklus hidup

Untuk mendaftarkan kait siklus hidup, terapkan antarmuka IDistributedApplicationLifecycleHook dan daftarkan kait tersebut dengan host aplikasi menggunakan API AddLifecycleHook.

using Aspire.Hosting.Lifecycle;
using Microsoft.Extensions.Logging;

var builder = DistributedApplication.CreateBuilder(args);

builder.Services.AddLifecycleHook<LifecycleLogger>();

builder.Build().Run();

internal sealed class LifecycleLogger(ILogger<LifecycleLogger> logger)
    : IDistributedApplicationLifecycleHook
{
    public Task BeforeStartAsync(
        DistributedApplicationModel appModel, CancellationToken cancellationToken = default)
    {
        logger.LogInformation("BeforeStartAsync");
        return Task.CompletedTask;
    }

    public Task AfterEndpointsAllocatedAsync(
        DistributedApplicationModel appModel, CancellationToken cancellationToken = default)
    {
        logger.LogInformation("AfterEndpointsAllocatedAsync");
        return Task.CompletedTask;
    }

    public Task AfterResourcesCreatedAsync(
        DistributedApplicationModel appModel, CancellationToken cancellationToken = default)
    {
        logger.LogInformation("AfterResourcesCreatedAsync");
        return Task.CompletedTask;
    }
}

Kode sebelumnya:

Ketika host aplikasi ini dijalankan, pengait siklus hidup dieksekusi untuk setiap peristiwa. Output berikut dihasilkan:

info: LifecycleLogger[0]
      BeforeStartAsync
info: Aspire.Hosting.DistributedApplication[0]
      Aspire version: 9.0.0
info: Aspire.Hosting.DistributedApplication[0]
      Distributed application starting.
info: Aspire.Hosting.DistributedApplication[0]
      Application host directory is: ..\AspireApp\AspireApp.AppHost
info: LifecycleLogger[0]
      AfterEndpointsAllocatedAsync
info: Aspire.Hosting.DistributedApplication[0]
      Now listening on: https://localhost:17043
info: Aspire.Hosting.DistributedApplication[0]
      Login to the dashboard at https://localhost:17043/login?t=d80f598bc8a64c7ee97328a1cbd55d72
info: LifecycleLogger[0]
      AfterResourcesCreatedAsync
info: Aspire.Hosting.DistributedApplication[0]
      Distributed application started. Press Ctrl+C to shut down.

Cara yang disukai untuk terhubung ke siklus hidup host aplikasi adalah dengan menggunakan API peristiwa. Untuk informasi selengkapnya, lihat peristiwa di .NET.NET Aspire.

Konteks eksekusi

IDistributedApplicationBuilder mengekspos konteks eksekusi (DistributedApplicationExecutionContext), yang menyediakan informasi tentang eksekusi host aplikasi saat ini. Konteks ini dapat digunakan untuk mengevaluasi apakah host aplikasi sedang dieksekusi sebagai mode "jalankan" atau tidak, atau sebagai bagian dari operasi penerbitan. Pertimbangkan properti berikut:

  • IsRunMode: Mengembalikan true jika operasi saat ini sedang berjalan.
  • IsPublishMode: Mengembalikan true jika operasi saat ini sedang dalam proses publikasi.

Informasi ini dapat berguna ketika Anda ingin menjalankan kode secara kondisional berdasarkan operasi saat ini. Pertimbangkan contoh berikut yang menunjukkan penggunaan properti IsRunMode. Dalam hal ini, metode ekstensi digunakan untuk menghasilkan nama simpul yang stabil untuk RabbitMQ untuk eksekusi pengembangan lokal.

private static IResourceBuilder<RabbitMQServerResource> RunWithStableNodeName(
    this IResourceBuilder<RabbitMQServerResource> builder)
{
    if (builder.ApplicationBuilder.ExecutionContext.IsRunMode)
    {
        builder.WithEnvironment(context =>
        {
            // Set a stable node name so queue storage is consistent between sessions
            var nodeName = $"{builder.Resource.Name}@localhost";
            context.EnvironmentVariables["RABBITMQ_NODENAME"] = nodeName;
        });
    }

    return builder;
}

Konteks eksekusi sering digunakan untuk menambahkan sumber daya atau string koneksi secara kondisional yang menunjuk ke sumber daya yang ada. Pertimbangkan contoh berikut yang menunjukkan penambahan Redis atau string koneksi secara kondisional berdasarkan konteks eksekusi:

var builder = DistributedApplication.CreateBuilder(args);

var redis = builder.ExecutionContext.IsRunMode
    ? builder.AddRedis("redis")
    : builder.AddConnectionString("redis");

builder.AddProject<Projects.WebApplication>("api")
       .WithReference(redis);

builder.Build().Run();

Dalam kode sebelumnya:

  • Jika host aplikasi berjalan dalam mode "jalankan", sumber daya kontainer Redis ditambahkan.
  • Jika host aplikasi berjalan dalam mode "terbitkan", string koneksi ditambahkan.

Logika ini dapat dengan mudah dibalikkan untuk terhubung ke sumber daya Redis yang ada saat Anda menjalankan tugas secara lokal, dan membuat sumber daya Redis baru saat Anda melakukan publikasi.

Penting

.NET .NET Aspire menyediakan API umum untuk mengontrol modalitas pembangun sumber daya, memungkinkan sumber daya berperilaku berbeda berdasarkan mode eksekusi. API fluida dimulai dengan RunAs* dan PublishAs*. API RunAs* memengaruhi perilaku pengembangan lokal (atau mode eksekusi), sedangkan API PublishAs* memengaruhi penerbitan sumber daya. Untuk informasi selengkapnya tentang cara sumber daya Azure menggunakan API ini, lihat Menggunakan sumber daya Azure yang ada.

Hubungan sumber daya

Hubungan sumber daya menautkan sumber daya bersama-sama. Hubungan bersifat informasional dan tidak memengaruhi perilaku runtime aplikasi. Sebagai gantinya, mereka digunakan saat menampilkan detail tentang sumber daya di dasbor. Sebagai contoh, hubungan dapat terlihat di detail sumber daya dasbor , dan hubungan Parent mengontrol pengelompokan sumber daya di halaman sumber daya.

Hubungan secara otomatis dibuat oleh beberapa API model aplikasi. Contohnya:

  • WithReference menambahkan hubungan pada sumber daya target dengan jenis Reference.
  • WaitFor menambahkan hubungan ke sumber daya target dengan jenis WaitFor.
  • Menambahkan database ke kontainer DB membuat hubungan dari database ke kontainer dengan jenis Parent.

Hubungan juga dapat ditambahkan secara eksplisit ke model aplikasi menggunakan WithRelationship dan WithParentRelationship.

var builder = DistributedApplication.CreateBuilder(args);

var catalogDb = builder.AddPostgres("postgres")
                       .WithDataVolume()
                       .AddDatabase("catalogdb");

builder.AddProject<Projects.AspireApp_CatalogDbMigration>("migration")
       .WithReference(catalogDb)
       .WithParentRelationship(catalogDb);

builder.Build().Run();

Contoh sebelumnya menggunakan WithParentRelationship untuk mengonfigurasi database catalogdb sebagai induk proyek migration. Hubungan Parent istimewa karena mengendalikan penataan hierarki sumber daya pada halaman sumber daya. Dalam contoh ini, migration disarangkan di bawah catalogdb.

Nota

Ada validasi untuk relasi induk untuk mencegah sumber daya memiliki beberapa induk atau membuat referensi melingkar. Konfigurasi ini tidak dapat ditampilkan di UI, dan model aplikasi akan menghasilkan kesalahan.

Lihat juga