Udostępnij za pośrednictwem


Lepszy schemat nazw zasobów Azure

W .NET Aspire wersji 9.0 ogólnie dostępnej schemat nazewnictwa zasobów Azure został zaktualizowany do bardziej niezawodnego i elastycznego systemu. Ta zmiana rozwiązuje kwestie związane z poprzednim schematem nazewnictwa, które spowodowały problemy, takie jak obcięcie nazw i nieprawidłowe wdrożenia oprogramowania.

Wersja wprowadzona

.NET .NET Aspire 9.0 (ogólna dostępność)

Poprzednie zachowanie

Poprzednia wersja używała wczesnej/alfa wersji Azure.Provisioning, która stosowała schemat nazewnictwa dążący do bycia najmniej wspólnym mianownikiem dla wszystkich zasobów. Często powodowało to obcięcie nazw lub nieprawidłowe nazwy.

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

Nowe zachowanie

Nowa wersja Azure.Provisioning używa bardziej zaawansowanego schematu nazewnictwa, który uwzględnia określone wymagania poszczególnych typów zasobów, takie jak maksymalna długość i prawidłowe znaki.

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

Typ zmiany powodującej niezgodność

Ta zmiana jest zmianą zachowawczą.

Użytkownicy, którzy chcą zachować stary schemat nazewnictwa, mogą dostosować obiekt AzureProvisioningContext CDK. Można to zrobić, konfigurując klasę AzureProvisioningOptions i wstawiając program rozpoznawania AzureResourceNamePropertyResolverAspireV8.

var builder = DistributedApplication.CreateBuilder(args);

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

Interfejsy API, których dotyczy problem

Żaden.