Raggruppare risorse in .NET Aspire

di Morgan Pizzini, in ASP.NET Core,

In .NET Aspire si possono inserire un'enorme quantità di progetti, servizi, applicazioni, tutte perfettamente elencate e gestite all'interno della dashboard. Ma al momento non esiste nessun sistema di archiviazione o categorizzazione delle risorse in modo da facilitarne la visione all'interno dell'interfaccia.

Sarebbe ottimale avere degli extension method che permettano la creazione in primis di un gruppo a cui dare un nome e poi associare una risorsa al gruppo appena creato.

var apiGroup = builder.AddGroup("nome-gruppo-api");
builder.AddProject<Projects.MioProgetto>("mio-progetto")
    .InGroup(apiGroup);

Come anticipato questo codice non funzionerà, perchè fisicamente non implementato nella piattaforma, ma essendo .NET Aspire completamente personalizzabile, possiamo creare i metodi necessari per gestire l'interfaccia utente e dunque permettere la compilazione della soluzione.

static class AspireHostingExtensions
{
    public static IResourceBuilder<Resource> AddGroup
        (this IDistributedApplicationBuilder builder, string name) =>
        builder.AddResource(new GroupResource(name))
            .WithInitialState(new()
            {
                State = new(KnownResourceStates.Running, KnownResourceStateStyles.Success),
                ResourceType = "Group",
                Properties = []
            });

    public static IResourceBuilder<T> InGroup<T>(this IResourceBuilder<T> builder, 
        IResourceBuilder<IResource> group)
        where T : IResource
    {
        if (builder.Resource.TryGetAnnotationsOfType<ResourceSnapshotAnnotation>(out var annot))
        {
            foreach (var snapshot in annot)
            {
                snapshot.InitialSnapshot.GetType().GetProperty("Properties")?.SetValue(snapshot.InitialSnapshot,
                    snapshot.InitialSnapshot.Properties.Add(new("resource.parentName", "data")));
            }
        }
        else
        {
            builder.WithInitialState(new()
            {
                ResourceType = builder.Resource.GetType().Name ?? "Unknown",
                Properties =
                [
                    new("resource.parentName", group.Resource.Name),
                ]
            });
        }

        return builder;
    }


    class GroupResource(string name) : Resource(name)
    {
    }
}

Commenti

Visualizza/aggiungi commenti

| Condividi su: LinkedIn, Facebook

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi