Megosztás a következőn keresztül:


Egyéni .NET.NET Aspire üzemeltetési integrációk létrehozása

.NET .NET Aspire javítja a fejlesztési élményt azáltal, hogy újrafelhasználható építőelemeket biztosít, amelyekkel gyorsan rendezheti az alkalmazásfüggőségeket, és elérhetővé teheti őket a saját kódjához. Egy Aspire-alapú alkalmazás egyik fő építőeleme a erőforrás. Tekintse át az alábbi kódot:

var builder = DistributedApplication.CreateBuilder(args);

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

var db = builder.AddPostgres("pgserver")
                .AddDatabase("inventorydb");

builder.AddProject<Projects.InventoryService>("inventoryservice")
       .WithReference(redis)
       .WithReference(db);

Az előző kódban négy erőforrás szerepel:

  1. cache: Egy Redis tároló.
  2. pgserver: Egy Postgres tároló.
  3. inventorydb: A pgserver-on üzemeltetett adatbázis.
  4. inventoryservice: Egy ASP.NET Core alkalmazás.

A legtöbb .NET.NET Aspire-hoz kapcsolódó kód, amelyet az átlagos fejlesztő ír, az erőforrások alkalmazásmodellhez való hozzáadására és a köztük lévő hivatkozások létrehozására szolgál.

.NET .NET Aspire egyéni erőforrás főbb elemei

Az egyéni erőforrás .NET.NET Aspire létrehozásához a következőkre van szükség:

  1. Egyéni erőforrástípus, amely implementálja a IResource
  2. A IDistributedApplicationBuilderAdd{CustomResource} nevű bővítménymetódusa, ahol a {CustomResource} az egyéni erőforrás neve.

Ha az egyéni erőforrás opcionális konfigurációt igényel, előfordulhat, hogy a fejlesztők With* utótagos bővítménymetszeti módszereket szeretnének implementálni, hogy ezek a konfigurációs beállítások felderíthetők legyenek a szerkesztőmintahasználatával.

Gyakorlati példa: MailDev

Az egyéni erőforrások fejlesztésének megértéséhez ez a cikk bemutat egy példát arra, hogyan lehet egyéni erőforrást létrehozni MailDev-hoz. MailDev egy nyílt forráskódú eszköz, amely egy helyi levelezési kiszolgálót biztosít, amely lehetővé teszi a fejlesztők számára az e-mailek küldésének viselkedését az alkalmazáson belül. A további információkért, lásd a MailDevGitHub adattárat.

Ebben a példában egy új .NET Aspire projektet hoz létre tesztkörnyezetként a létrehozott MailDev erőforráshoz. Bár létrehozhat egyéni erőforrásokat meglévő .NET Aspire projektekben, érdemes megfontolni, hogy az egyéni erőforrás több .NET Aspire-alapú megoldásban használható-e, és újrahasználható integrációként kell-e kifejleszteni.

A kezdőprojekt beállítása

Hozzon létre egy új .NET.NET Aspire projektet, amely a fejlesztendő új erőforrás tesztelésére szolgál.

dotnet new aspire -o MailDevResource
cd MailDevResource
dir

A projekt létrehozása után látnia kell egy listát, amely a következőket tartalmazza:

  • MailDevResource.AppHost: Az egyéni erőforrás teszteléséhez használt alkalmazásgazda.
  • MailDevResource.ServiceDefaults: A szolgáltatás alapértelmezés szerint projektet használja a szolgáltatással kapcsolatos projektekben való használatra.
  • MailDevResource.sln: A megoldásfájl mindkét projektre hivatkozik.

Az alábbi parancs végrehajtásával ellenőrizze, hogy a projekt képes-e sikeresen felépíteni és futtatni a projektet:

dotnet run --project MailDevResource.AppHost/MailDevResource.AppHost.csproj

A konzol kimenetének a következőhöz hasonlóan kell kinéznie:

Building...
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:
      ..\docs-aspire\docs\extensibility\snippets\MailDevResource\MailDevResource.AppHost
info: Aspire.Hosting.DistributedApplication[0]
      Now listening on: https://localhost:17251
info: Aspire.Hosting.DistributedApplication[0]
      Login to the dashboard at https://localhost:17251/login?t=928db244c720c5022a7a9bf5cf3a3526
info: Aspire.Hosting.DistributedApplication[0]
      Distributed application started. Press Ctrl+C to shut down.

A .NET irányítópult megtekintéséhez válassza a .NET Aspire:

Képernyőkép a tesztprojekt üres .NET.NET Aspire irányítópultjáról.

Nyomja le a Ctrl+C billentyűkombinációt az alkalmazás leállításához (bezárhatja a böngészőlapot).

Erőforrás-bővítmény kódtárának létrehozása

.NET Aspire erőforrások csak osztályokat és metódusokat tartalmaznak egy osztálytárban, amely a .NET Aspire üzemeltetési könyvtárra (Aspire.Hosting) hivatkozik. Ha az erőforrást egy külön projektbe helyezi, egyszerűbben megoszthatja .NET.NET Aspire-alapú alkalmazások között, és akár csomagolhatja és megoszthatja a NuGeten.

  1. Hozzon létre egy MailDev.Hostingnevű osztálykönyvtár projektet.

    dotnet new classlib -o MailDev.Hosting
    
  2. Aspire.Hosting hozzáadása az osztálytárhoz csomaghivatkozásként.

    dotnet add ./MailDev.Hosting/MailDev.Hosting.csproj package Aspire.Hosting --version 9.0.0
    

    Fontos

    Az itt megadott verziónak meg kell egyeznie a telepített .NET.NET Aspire számítási feladat verziójával.

  3. Adjon hozzá osztálytár-hivatkozást a MailDevResource.AppHost projekthez.

    dotnet add ./MailDevResource.AppHost/MailDevResource.AppHost.csproj reference ./MailDev.Hosting/MailDev.Hosting.csproj
    
  4. Osztálytárprojekt hozzáadása a megoldásfájlhoz.

    dotnet sln ./MailDevResource.sln add ./MailDev.Hosting/MailDev.Hosting.csproj
    

A következő lépések elvégzése után elindíthatja a projektet:

dotnet run --project ./MailDevResource.AppHost/MailDevResource.AppHost.csproj

Ez egy figyelmeztetést eredményez a konzolon:

.\.nuget\packages\aspire.hosting.apphost\9.0.0\build\Aspire.Hosting.AppHost.targets(174,5): warning ASPIRE004: '..\MailDev.Hosting\MailDev.Hosting.csproj' is referenced by an A
spire Host project, but it is not an executable. Did you mean to set IsAspireProjectResource="false"? [D:\source\repos\docs-aspire\docs\extensibility\snippets\MailDevResource\MailDevResource.AppHost\MailDevRe
source.AppHost.csproj]

Ennek az az oka, hogy .NET.NET Aspire úgy kezeli az alkalmazásgazda projekthivatkozásait, mintha szolgáltatásprojektek lennének. Ha meg szeretné mondani .NET.NET Aspire, hogy a projekthivatkozást nem szolgáltatásként kell kezelni, módosítsa a MailDevResource.AppHostMailDevResource.AppHost.csproj projektre mutató MailDev.Hosting fájlhivatkozást a következőkre:

<ItemGroup>
  <!-- The IsAspireProjectResource attribute tells .NET Aspire to treat this 
       reference as a standard project reference and not attempt to generate
       a metadata file -->
  <ProjectReference Include="..\MailDev.Hosting\MailDev.Hosting.csproj"
                    IsAspireProjectResource="false" />
</ItemGroup>

Most, amikor elindítja az alkalmazás gazdagépét, a konzolon nem jelenik meg figyelmeztetés.

Az erőforrástípusok meghatározása

A MailDev.Hosting osztálykönyvtár tartalmazza az erőforrás típusát és a kiterjesztési metódusokat az erőforrás alkalmazás-gazdapéldányhoz való hozzáadásához. Először is gondolja át, milyen élményt szeretne nyújtani a fejlesztőknek az egyéni erőforrás használatakor. Az egyéni erőforrás esetében azt szeretné, hogy a fejlesztők az alábbi módon írjanak kódot:

var builder = DistributedApplication.CreateBuilder(args);

var maildev = builder.AddMailDev("maildev");

builder.AddProject<Projects.NewsletterService>("newsletterservice")
       .WithReference(maildev);

Ehhez szükség van egy MailDevResource nevű egyéni erőforrásra, amely IResourceWithConnectionString implementál, hogy a felhasználók WithReference kiterjesztéssel használhassák a MailDev-kiszolgáló kapcsolati adatainak kapcsolati sztringként való beszúrásához.

MailDev tárolóerőforrásként érhető el, ezért érdemes ContainerResource-ből származtatni, hogy a .NET.NET Aspirekülönböző, már meglévő tárolóalapú bővítményeket használhassuk.

Cserélje le a Class1.cs fájl tartalmát a MailDev.Hosting projektben, és nevezze át a fájlt MailDevResource.cs a következő kódra:

// For ease of discovery, resource types should be placed in
// the Aspire.Hosting.ApplicationModel namespace. If there is
// likelihood of a conflict on the resource name consider using
// an alternative namespace.
namespace Aspire.Hosting.ApplicationModel;

public sealed class MailDevResource(string name) : ContainerResource(name), IResourceWithConnectionString
{
    // Constants used to refer to well known-endpoint names, this is specific
    // for each resource type. MailDev exposes an SMTP endpoint and a HTTP
    // endpoint.
    internal const string SmtpEndpointName = "smtp";
    internal const string HttpEndpointName = "http";

    // An EndpointReference is a core .NET Aspire type used for keeping
    // track of endpoint details in expressions. Simple literal values cannot
    // be used because endpoints are not known until containers are launched.
    private EndpointReference? _smtpReference;

    public EndpointReference SmtpEndpoint =>
        _smtpReference ??= new(this, SmtpEndpointName);

    // Required property on IResourceWithConnectionString. Represents a connection
    // string that applications can use to access the MailDev server. In this case
    // the connection string is composed of the SmtpEndpoint endpoint reference.
    public ReferenceExpression ConnectionStringExpression =>
        ReferenceExpression.Create(
            $"smtp://{SmtpEndpoint.Property(EndpointProperty.Host)}:{SmtpEndpoint.Property(EndpointProperty.Port)}"
        );
}

Az előző egyéni erőforrásban a EndpointReference és a ReferenceExpression számos olyan típusra mutatnak be példákat, amelyek interfészek gyűjteményét implementálják, például IManifestExpressionProvider, IValueProviderés IValueWithReferences. Ezekről a típusokról és a .NET.NET Aspirebetöltött szerepükről további információért lásd a(z) technikai részleteknél.

Az erőforrásbővítmények meghatározása

Annak érdekében, hogy a fejlesztők könnyebben használják az egyéni erőforrást, hozzá kell adni egy AddMailDev nevű bővítménymetódust a MailDev.Hosting projekthez. A AddMailDev bővítménymetódus felelős az erőforrás konfigurálásáért, hogy sikeresen elinduljon tárolóként.

Adja hozzá a következő kódot egy új fájlhoz, amelynek neve MailDevResourceBuilderExtensions.cs a MailDev.Hosting projektben:

using Aspire.Hosting.ApplicationModel;

// Put extensions in the Aspire.Hosting namespace to ease discovery as referencing
// the .NET Aspire hosting package automatically adds this namespace.
namespace Aspire.Hosting;

public static class MailDevResourceBuilderExtensions
{
    /// <summary>
    /// Adds the <see cref="MailDevResource"/> to the given
    /// <paramref name="builder"/> instance. Uses the "2.1.0" tag.
    /// </summary>
    /// <param name="builder">The <see cref="IDistributedApplicationBuilder"/>.</param>
    /// <param name="name">The name of the resource.</param>
    /// <param name="httpPort">The HTTP port.</param>
    /// <param name="smtpPort">The SMTP port.</param>
    /// <returns>
    /// An <see cref="IResourceBuilder{MailDevResource}"/> instance that
    /// represents the added MailDev resource.
    /// </returns>
    public static IResourceBuilder<MailDevResource> AddMailDev(
        this IDistributedApplicationBuilder builder,
        string name,
        int? httpPort = null,
        int? smtpPort = null)
    {
        // The AddResource method is a core API within .NET Aspire and is
        // used by resource developers to wrap a custom resource in an
        // IResourceBuilder<T> instance. Extension methods to customize
        // the resource (if any exist) target the builder interface.
        var resource = new MailDevResource(name);

        return builder.AddResource(resource)
                      .WithImage(MailDevContainerImageTags.Image)
                      .WithImageRegistry(MailDevContainerImageTags.Registry)
                      .WithImageTag(MailDevContainerImageTags.Tag)
                      .WithHttpEndpoint(
                          targetPort: 1080,
                          port: httpPort,
                          name: MailDevResource.HttpEndpointName)
                      .WithEndpoint(
                          targetPort: 1025,
                          port: smtpPort,
                          name: MailDevResource.SmtpEndpointName);
    }
}

// This class just contains constant strings that can be updated periodically
// when new versions of the underlying container are released.
internal static class MailDevContainerImageTags
{
    internal const string Registry = "docker.io";

    internal const string Image = "maildev/maildev";

    internal const string Tag = "2.1.0";
}

Ellenőrizze az egyéni integrációt az alkalmazáshosten belül

Most, hogy az egyéni erőforrás alapstruktúrája elkészült, ideje tesztelni egy valódi AppHost-projektben. Nyissa meg a Program.cs fájlt a MailDevResource.AppHost projektben, és frissítse a következő kóddal:

var builder = DistributedApplication.CreateBuilder(args);

var maildev = builder.AddMailDev("maildev");

builder.Build().Run();

A Program.cs fájl frissítése után indítsa el az alkalmazásgazdaprojektet, és nyissa meg az irányítópultot:

dotnet run --project ./MailDevResource.AppHost/MailDevResource.AppHost.csproj

Néhány pillanat múlva az irányítópulton látható, hogy az maildev erőforrás fut, és elérhető lesz egy hivatkozás, amely a MailDev webalkalmazásra navigál, amely megjeleníti az alkalmazás által küldött e-mailek tartalmát.

Az .NET.NET Aspire irányítópultnak a következőhöz hasonlóan kell kinéznie:

MailDev erőforrás látható a .NET Aspire irányítópulton.

A MailDev webalkalmazásnak a következőhöz hasonlóan kell kinéznie:

MailDev.NET Aspireáltal felügyelt tárolóként futó webes felhasználói felület.

.NET szolgáltatásprojekt hozzáadása az alkalmazás-kiszolgálóhoz tesztelés céljából

Ha .NET Aspire sikeresen elindíthatja a MailDev integrációt, ideje a MailDev projekten belüli .NET kapcsolati adatait felhasználni. Az .NET.NET Aspire gyakori, hogy van egy üzemeltetési csomag és egy vagy több összetevőcsomag. Vegyük például a következőt:

  • üzemeltetési csomag: Az alkalmazásmodell erőforrásainak ábrázolására szolgál.
    • Aspire.Hosting.Redis
  • összetevőcsomagok: Ügyfélkódtárak konfigurálására és felhasználására szolgál.
    • Aspire.StackExchange.Redis
    • Aspire.StackExchange.Redis.DistributedCaching
    • Aspire.StackExchange.Redis.OutputCaching

Az MailDev erőforrás esetében a .NET platform már rendelkezik egy egyszerű SMTP-ügyfélrel SmtpClientformájában. Ebben a példában ezt a meglévő API-t az egyszerűség kedvéért használja, bár más erőforrástípusok is kihasználhatják az egyéni integrációs kódtárak előnyeit a fejlesztők segítségére.

A végpontok közötti forgatókönyv teszteléséhez szüksége van egy .NET projektre, amelybe beszúrhatjuk a kapcsolati adatokat a MailDev erőforráshoz. Webes API-projekt hozzáadása:

  1. Hozzon létre egy .NETnevű új MailDevResource.NewsletterService projektet.

    dotnet new webapi --use-minimal-apis -o MailDevResource.NewsletterService
    
  2. Adjon hozzá egy hivatkozást a MailDev.Hosting projekthez.

    dotnet add ./MailDevResource.NewsletterService/MailDevResource.NewsletterService.csproj reference ./MailDev.Hosting/MailDev.Hosting.csproj
    
  3. Adjon hozzá egy hivatkozást a MailDevResource.AppHost projekthez.

    dotnet add ./MailDevResource.AppHost/MailDevResource.AppHost.csproj reference ./MailDevResource.NewsletterService/MailDevResource.NewsletterService.csproj
    
  4. Adja hozzá az új projektet a megoldásfájlhoz.

    dotnet sln ./MailDevResource.sln add ./MailDevResource.NewsletterService/MailDevResource.NewsletterService.csproj
    

A projekt hozzáadása és a hivatkozások frissítése után nyissa meg a Program.cs projekt MailDevResource.AppHost.csproj, és frissítse a forrásfájlt az alábbihoz hasonlóan:

var builder = DistributedApplication.CreateBuilder(args);

var maildev = builder.AddMailDev("maildev");

builder.AddProject<Projects.MailDevResource_NewsletterService>("newsletterservice")
       .WithReference(maildev);

builder.Build().Run();

A Program.cs fájl frissítése után indítsa el újra az alkalmazásszervert. Ezután ellenőrizze, hogy a Hírlevél szolgáltatás elindult-e, és hogy a ConnectionStrings__maildev környezeti változó hozzá lett-e adva a folyamathoz. Az Erőforrások lapon keresse meg a newsletterservice sort, és válassza ki a Nézet hivatkozást a Részletek oszlopban.

Szolgáltatás hírlevél környezeti változói a .NET.NET Aspire irányítópulton.

Az előző képernyőképen a newsletterservice projekt környezeti változói láthatók. A ConnectionStrings__maildev környezeti változó az a kapcsolati sztring, amelyet a maildev erőforrás a projektbe injektált.

Kapcsolati sztring használata üzenetek küldéséhez

Az SMTP-kapcsolat részleteinek használatához, amelyeket a hírlevélszolgáltatás projektbe illesztettek, egy SmtpClient példányt kell singletonként a függőséginjektálási tárolóba injektálni. Adja hozzá a következő kódot a Program.cs projekt MailDevResource.NewsletterService fájljába az egyszeri szolgáltatás beállításához. A Program osztályban közvetlenül a // Add services to the container megjegyzés után adja hozzá a következő kódot:

builder.Services.AddSingleton<SmtpClient>(sp =>
{
    var smtpUri = new Uri(builder.Configuration.GetConnectionString("maildev")!);

    var smtpClient = new SmtpClient(smtpUri.Host, smtpUri.Port);

    return smtpClient;
});

Borravaló

Ez a kódrészlet azonban a hivatalos SmtpClienttámaszkodik; ez a típus egyes platformokon elavult, és mások számára nem ajánlott. Az MailKitmodernebb megközelítéséért lásd: Egyéni .NET.NET Aspire ügyfélintegrációk létrehozása.

Az ügyfél teszteléséhez adjon hozzá két egyszerű subscribe és unsubscribe POST metódust a hírlevél szolgáltatáshoz. Adja hozzá a következő kódot a "weatherforecast" MapGet hívás helyett a Program.cs projekt fájljában a ASP.NET Core útvonalak beállításához:

app.MapPost("/subscribe", async (SmtpClient smtpClient, string email) =>
{
    using var message = new MailMessage("newsletter@yourcompany.com", email)
    {
        Subject = "Welcome to our newsletter!",
        Body = "Thank you for subscribing to our newsletter!"
    };

    await smtpClient.SendMailAsync(message);
});

app.MapPost("/unsubscribe", async (SmtpClient smtpClient, string email) =>
{
    using var message = new MailMessage("newsletter@yourcompany.com", email)
    {
        Subject = "You are unsubscribed from our newsletter!",
        Body = "Sorry to see you go. We hope you will come back soon!"
    };

    await smtpClient.SendMailAsync(message);
});

Borravaló

Ne felejtse el hivatkozni a System.Net.MailMicrosoft.AspNetCore.Mvc és Program.cs névterére, ha a kódszerkesztő nem adja hozzá őket automatikusan.

A Program.cs fájl frissítése után indítsa el az alkalmazás gazdagépét, és használja a böngészőt, vagy használja a curl-et a következő URL-címek eléréséhez (alternatívaként, ha Visual Studio-t használ, akkor használhatja a .http fájlokat is).

POST /subscribe?email=test@test.com HTTP/1.1
Host: localhost:7251
Content-Type: application/json

Az API használatához curl használatával küldheti el a kérést. Az alábbi curl parancs egy HTTP-POST kérelmet küld a subscribe végpontra, és email lekérdezési sztring értéket vár, hogy feliratkozhasson a hírlevélre. A Content-Type fejléc application/json-re van állítva, jelezve, hogy a kérelemtörzs JSON formátumú.

curl -H "Content-Type: application/json" --request POST https://localhost:7251/subscribe?email=test@test.com

A következő API a unsubscribe végpont. Ez a végpont a hírlevélről való leiratkozásra szolgál.

POST /unsubscribe?email=test@test.com HTTP/1.1
Host: localhost:7251
Content-Type: application/json

A hírlevélről való leiratkozáshoz használja az alábbi curl parancsot, amely egy email paramétert ad át a unsubscribe végpontnak lekérdezési sztringként:

curl -H "Content-Type: application/json" --request POST https://localhost:7251/unsubscribe?email=test@test.com

Borravaló

Győződjön meg arról, hogy a https://localhost:7251 portot kicseréli a megfelelő localhost portra (a futtatott alkalmazásgazda URL-címére).

Ha ezek az API-hívások sikeres választ adnak vissza (HTTP 200, OK), akkor a maildev erőforráson kiválaszthatja az irányítópultot, és a MailDev UI megjeleníti az SMTP-végpontnak küldött e-maileket.

MailDev felhasználói felületen látható e-mailek

Technikai részletek

A következő szakaszokban különböző technikai részleteket ismertetünk, amelyeket fontos megérteni a .NET.NET Aspireegyéni erőforrásainak fejlesztésekor.

Biztonságos hálózatkezelés

Ebben a példában a MailDev erőforrás egy tárolóerőforrás, amely HTTP-en és SMTP-en keresztül érhető el a gazdagép számára. A MailDev erőforrás egy fejlesztési eszköz, és nem éles használatra készült. A HTTPS használatához lásd: MailDev: HTTPS-konfigurálása.

A hálózati végpontokat elérhetővé tevő egyéni erőforrások fejlesztésekor fontos figyelembe venni az erőforrás biztonsági következményeit. Ha például az erőforrás egy adatbázis, fontos gondoskodni arról, hogy az adatbázis biztonságos legyen, és hogy a kapcsolati sztring ne legyen elérhető a nyilvános interneten.

A ReferenceExpression és EndpointReference típusa

Az előző kódban a MailDevResource két tulajdonsággal rendelkezik:

Ezek a típusok számos olyan típus közé tartoznak, amelyeket a .NET Aspire a konfigurációs adatok megjelenítésére használnak, amelyek mindaddig nem véglegesítve vannak, amíg a .NET Aspire projektet nem futtatják vagy közzé nem teszik a felhőben egy olyan eszközzel, mint a Azure Developer CLI (azd).

Az alapvető probléma, amelyet ezek a típusok segítenek megoldani, a konkrét konfigurációs információk feloldásának elhalasztása, amíg az összes az információ rendelkezésre áll.

A MailDevResource például egy ConnectionStringExpression nevű tulajdonságot tesz elérhetővé a IResourceWithConnectionString interfész által megkövetelt módon. A tulajdonság típusa ReferenceExpression, és úgy jön létre, hogy egy interpolált sztringet ad át a Create metódusnak.

public ReferenceExpression ConnectionStringExpression =>
    ReferenceExpression.Create(
        $"smtp://{SmtpEndpoint.Property(EndpointProperty.Host)}:{SmtpEndpoint.Property(EndpointProperty.Port)}"
    );

A Create metódus aláírása a következő:

public static ReferenceExpression Create(
    in ExpressionInterpolatedStringHandler handler)

Ez nem egy szokásos String argumentum. A módszer a interpolált sztringkezelő mintát használja, hogy rögzítse az interpolált sztringsablont és a benne hivatkozott értékeket, hogy lehetővé tegye az egyéni feldolgozást. A .NET.NET Aspireesetében ezek a részletek egy ReferenceExpression-ben rögzítésre kerülnek, amely értékelhető, amint az interpolált karakterláncban hivatkozott értékek elérhetővé válnak.

A végrehajtás folyamata a következőképpen működik:

  1. A IResourceWithConnectionString megvalósító erőforrás hozzáadódik a modellhez (például AddMailDev(...)).
  2. A IResourceBuilder<MailDevResource> a rendszer átadja a WithReference, amely speciális túlterheléssel rendelkezik IResourceWithConnectionString implementátorok kezeléséhez.
  3. A WithReference egy ConnectionStringReference-példányba burkolja az erőforrást, és az objektum rögzítődik egy EnvironmentCallbackAnnotation-ben, amely a .NET.NET Aspire projekt felépítése és elindulása után lesz kiértékelve.
  4. A kapcsolati sztringre hivatkozó folyamat .NET.NET Aspire elindul, majd elkezdi a kifejezés kiértékelését. Először, megkapja a ConnectionStringReference-t, és meghívja a IValueProvider.GetValueAsync-et.
  5. A GetValueAsync metódus lekéri a ConnectionStringExpression tulajdonság értékét a ReferenceExpression példány lekéréséhez.
  6. A IValueProvider.GetValueAsync metódus ezután meghívja GetValueAsync a korábban rögzített interpolált sztring feldolgozásához.
  7. Mivel az interpolált sztring más referenciatípusokra is hivatkozik, például EndpointReference, ezeket is kiértékelik, és a valós értéket helyettesítik, amint az most már elérhető.

Nyilvános közzététel

A IManifestExpressionProvider felület úgy lett kialakítva, hogy megoldja a kapcsolati információk erőforrások közötti megosztásának problémáját az üzembe helyezéskor. Ennek a problémának a megoldását a .NET.NET Aspire belső hurkos hálózatkezelés áttekintésiismerteti. A helyi fejlesztéshez hasonlóan számos érték szükséges az alkalmazás konfigurálásához, de nem határozhatók meg, amíg az alkalmazást nem telepítik egy eszközzel, például azd (Azure Developer CLI).

A probléma megoldásához .NET.NET Aspire létrehoz egy jegyzékfájlt, amelyet azd és más üzembehelyezési eszközök értelmeznek. Ahelyett, hogy konkrét értékeket ad meg az erőforrások közötti kapcsolati információkhoz, kifejezésszintaxis használatos, amelyet az üzembehelyezési eszközök értékelnek. A jegyzékfájl általában nem látható a fejlesztők számára, de manuálisan is létrehozhat egyet. Az alábbi parancs az alkalmazás-kiszolgálón használható manifesztum létrehozásához.

dotnet run --project MailDevResource.AppHost/MailDevResource.AppHost.csproj -- --publisher manifest --output-path aspire-manifest.json

Ez a parancs a következőhöz hasonló jegyzékfájlt hoz létre:

{
  "resources": {
    "maildev": {
      "type": "container.v0",
      "connectionString": "smtp://{maildev.bindings.smtp.host}:{maildev.bindings.smtp.port}",
      "image": "docker.io/maildev/maildev:2.1.0",
      "bindings": {
        "http": {
          "scheme": "http",
          "protocol": "tcp",
          "transport": "http",
          "targetPort": 1080
        },
        "smtp": {
          "scheme": "tcp",
          "protocol": "tcp",
          "transport": "tcp",
          "targetPort": 1025
        }
      }
    },
    "newsletterservice": {
      "type": "project.v0",
      "path": "../MailDevResource.NewsletterService/MailDevResource.NewsletterService.csproj",
      "env": {
        "OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EXCEPTION_LOG_ATTRIBUTES": "true",
        "OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EVENT_LOG_ATTRIBUTES": "true",
        "OTEL_DOTNET_EXPERIMENTAL_OTLP_RETRY": "in_memory",
        "ASPNETCORE_FORWARDEDHEADERS_ENABLED": "true",
        "ConnectionStrings__maildev": "{maildev.connectionString}"
      },
      "bindings": {
        "http": {
          "scheme": "http",
          "protocol": "tcp",
          "transport": "http"
        },
        "https": {
          "scheme": "https",
          "protocol": "tcp",
          "transport": "http"
        }
      }
    }
  }
}

Mivel a MailDevResource implementálja a jegyzék-közzétételi logikát IResourceWithConnectionString.NET.NET Aspire tudja, hogy bár MailDevResource tárolóerőforrás, connectionString mezőre is szüksége van. A connectionString mező a jegyzékben szereplő maildev erőforrás más részeire hivatkozik a végső sztring létrehozásához:

{
    // ... other content omitted.
    "connectionString": "smtp://{maildev.bindings.smtp.host}:{maildev.bindings.smtp.port}"
}

.NET .NET Aspire tudja, hogyan kell létrehozni ezt a sztringet, mert ConnectionStringExpression-re néz, és a végső sztringet a IManifestExpressionProvider interfészen keresztül építi fel (ugyanúgy, mint ahogy a IValueProvider interfészt használják).

A MailDevResource automatikusan bekerül a jegyzékbe, mert az ContainerResourceszármazik. Az erőforrás-szerzők az erőforrás-szerkesztő ExcludeFromManifest bővítménymetódusával letilthatják a jegyzékbe való tartalomkimenetet.

public static IResourceBuilder<MailDevResource> AddMailDev(
    this IDistributedApplicationBuilder builder, 
    string name,
    int? httpPort = null,
    int? smtpPort = null)
{
    var resource = new MailDevResource(name);

    return builder.AddResource(resource)
                  .WithImage(MailDevContainerImageTags.Image)
                  .WithImageRegistry(MailDevContainerImageTags.Registry)
                  .WithImageTag(MailDevContainerImageTags.Tag)
                  .WithHttpEndpoint(
                      targetPort: 1080,
                      port: httpPort,
                      name: MailDevResource.HttpEndpointName)
                  .WithEndpoint(
                      targetPort: 1025,
                      port: smtpPort,
                      name: MailDevResource.SmtpEndpointName)
                  .ExcludeFromManifest(); // This line was added
}

Körültekintően kell mérlegelni, hogy az erőforrásnak szerepelnie kell-e a jegyzékben, vagy el kell-e tiltani. Ha az erőforrás hozzá van adva a jegyzékhez, úgy kell konfigurálni, hogy biztonságos és biztonságos legyen a használata.

Összefoglalás

Az egyéni erőforrás-oktatóanyagban megtanulta, hogyan hozhat létre egyéni .NET Aspire erőforrást, amely egy meglévő tárolóalapú alkalmazást (MailDev) használ. Ezt használta a helyi fejlesztési élmény javításához azáltal, hogy megkönnyíti az alkalmazáson belül használható e-mail képességek tesztelését. Ezek a tanulások a .NET.NET Aspire-alapú alkalmazásokban használható egyéb egyéni erőforrások létrehozására is alkalmazhatók. Ez a konkrét példa nem tartalmazott egyéni integrációkat, de egyéni integrációkat is ki lehet építeni, hogy a fejlesztők könnyebben használják az erőforrást. Ebben a forgatókönyvben a SmtpClient platform meglévő .NET osztályára támaszkodhatott e-mailek küldéséhez.

Következő lépések