Freigeben über


Besseres Azure-Ressourcennamensschema

In .NET Aspire 9.0 GA wurde das Azure Ressourcenbenennungsschema auf ein robusteres und flexibleres System aktualisiert. Diese Änderung behebt Probleme mit dem vorherigen Benennungsschema, was zu Problemen wie dem Abschneiden von Namen und ungültigen Bereitstellungen führte.

Eingeführte Version

.NET .NET Aspire 9.0 GA

Vorheriges Verhalten

Die vorherige Version hat eine frühe/Alpha-Version von Azure.Provisioningverwendet, die ein Benennungsschema verwendet hat, das versucht hat, den am wenigsten gemeinsamen Nenner aller Ressourcen zu sein. Dies führte häufig zu verkürzten oder ungültigen Namen.

protected string GetGloballyUniqueName(string resourceName)
    => $"toLower(take('{resourceName}${{uniqueString(resourceGroup().id)}}', 24))";

Neues Verhalten

Die neue Version von Azure.Provisioning verwendet ein komplexeres Benennungsschema, das die spezifischen Anforderungen jedes Ressourcentyps berücksichtigt, z. B. maximale Länge und gültige Zeichen.

public override BicepValue<string>? ResolveName(
    ProvisioningContext context,
    Resource resource,
    ResourceNameRequirements requirements)
{
    string prefix = SanitizeText(
        resource.ResourceName, requirements.ValidCharacters);

    string separator =
        requirements.ValidCharacters.HasFlag(ResourceNameCharacters.Hyphen) ? "-" :
        requirements.ValidCharacters.HasFlag(ResourceNameCharacters.Underscore) ? "_" :
        requirements.ValidCharacters.HasFlag(ResourceNameCharacters.Period) ? "." :
        "";

    BicepValue<string> suffix = GetUniqueSuffix(context, resource);

    return BicepFunction.Take(
        BicepFunction.Interpolate(
            $"{prefix}{separator}{suffix}"), requirements.MaxLength);
}

Art der Unterbrechungsänderung

Diese Änderung ist eine Verhaltensänderung.

Benutzer, die das alte Benennungsschema beibehalten möchten, können das Azure CDK-ProvisioningContext-Objekt anpassen. Dazu können Sie die AzureProvisioningOptions Klasse konfigurieren und den AzureResourceNamePropertyResolverAspireV8 Resolver einfügen.

var builder = DistributedApplication.CreateBuilder(args);

builder.Services.Configure<AzureProvisioningOptions>(options =>
{
    options.ProvisioningBuildOptions.InfrastructureResolvers.Insert(0, new AspireV8ResourceNamePropertyResolver());
});

Betroffene APIs

Nichts.