diff --git a/src/Aspire.Hosting.Azure.Provisioning/AzureProvisioner.cs b/src/Aspire.Hosting.Azure.Provisioning/AzureProvisioner.cs index 09d83eed30e..5bce810df35 100644 --- a/src/Aspire.Hosting.Azure.Provisioning/AzureProvisioner.cs +++ b/src/Aspire.Hosting.Azure.Provisioning/AzureProvisioner.cs @@ -156,8 +156,7 @@ private async Task ProvisionAzureComponents(IConfiguration configuration, IHostE tasks.Add(task); - c.TryGetName(out var name); - componentNameToStorageAccountMap.Remove(name!); + componentNameToStorageAccountMap.Remove(c.Name); } if (c is AzureServiceBusComponent serviceBus) @@ -173,8 +172,7 @@ private async Task ProvisionAzureComponents(IConfiguration configuration, IHostE tasks.Add(task); - c.TryGetName(out var name); - componentNameToServiceBusNamespaceMap.Remove(name!); + componentNameToServiceBusNamespaceMap.Remove(c.Name); } if (c is AzureKeyVaultComponent keyVault) @@ -190,8 +188,7 @@ private async Task ProvisionAzureComponents(IConfiguration configuration, IHostE tasks.Add(task); - c.TryGetName(out var name); - componentNameToKeyVaultMap.Remove(name!); + componentNameToKeyVaultMap.Remove(c.Name); } } @@ -230,8 +227,7 @@ private async Task CreateKeyVaultAsync( Guid principalId, CancellationToken cancellationToken) { - keyVault.TryGetName(out var name); - componentNameToKeyVaultMap.TryGetValue(name!, out var keyVaultResource); + componentNameToKeyVaultMap.TryGetValue(keyVault.Name, out var keyVaultResource); if (keyVaultResource is null) { @@ -247,7 +243,7 @@ private async Task CreateKeyVaultAsync( EnableRbacAuthorization = true }; var parameters = new KeyVaultCreateOrUpdateContent(location, properties); - parameters.Tags.Add("aspire-component-name", name); + parameters.Tags.Add("aspire-component-name", keyVault.Name); var operation = await keyVaults.CreateOrUpdateAsync(WaitUntil.Completed, vaultName, parameters, cancellationToken).ConfigureAwait(false); keyVaultResource = operation.Value; @@ -274,8 +270,7 @@ private async Task CreateServiceBusAsync( Guid principalId, CancellationToken cancellationToken) { - component.TryGetName(out var name); - componentNameToServiceBusNamespaceMap.TryGetValue(name!, out var serviceBusNamespace); + componentNameToServiceBusNamespaceMap.TryGetValue(component.Name, out var serviceBusNamespace); if (serviceBusNamespace is null) { @@ -285,7 +280,7 @@ private async Task CreateServiceBusAsync( logger.LogInformation("Creating service bus namespace {namespace} in {location}...", namespaceName, location); var parameters = new ServiceBusNamespaceData(location); - parameters.Tags.Add("aspire-component-name", name); + parameters.Tags.Add("aspire-component-name", component.Name); // Now we can create a storage account with defined account name and parameters var operation = await serviceBusNamespaces.CreateOrUpdateAsync(WaitUntil.Completed, namespaceName, parameters, cancellationToken).ConfigureAwait(false); @@ -367,8 +362,7 @@ private async Task CreateStorageAccountAsync( Guid principalId, CancellationToken cancellationToken) { - component.TryGetName(out var name); - componentNameToStorageAccountMap.TryGetValue(name!, out var storageAccount); + componentNameToStorageAccountMap.TryGetValue(component.Name, out var storageAccount); if (storageAccount is null) { @@ -381,7 +375,7 @@ private async Task CreateStorageAccountAsync( var sku = new StorageSku(StorageSkuName.StandardGrs); var kind = StorageKind.Storage; var parameters = new StorageAccountCreateOrUpdateContent(sku, kind, location); - parameters.Tags.Add("aspire-component-name", name); + parameters.Tags.Add("aspire-component-name", component.Name); // Now we can create a storage account with defined account name and parameters var accountCreateOperation = await storageAccounts.CreateOrUpdateAsync(WaitUntil.Completed, accountName, parameters, cancellationToken).ConfigureAwait(false); diff --git a/src/Aspire.Hosting.Dapr/DaprDistributedApplicationLifecycleHook.cs b/src/Aspire.Hosting.Dapr/DaprDistributedApplicationLifecycleHook.cs index c11ebafb8ad..3e5979b8a06 100644 --- a/src/Aspire.Hosting.Dapr/DaprDistributedApplicationLifecycleHook.cs +++ b/src/Aspire.Hosting.Dapr/DaprDistributedApplicationLifecycleHook.cs @@ -135,7 +135,6 @@ public Task BeforeStartAsync(DistributedApplicationModel appModel, CancellationT } })); - component.Annotations.Add(new NameAnnotation { Name = sidecarOptions?.AppId ?? "Unknown" }); component.Annotations.AddRange(ports.Select(port => new ServiceBindingAnnotation(ProtocolType.Tcp, name: port.Key, port: port.Value.Port))); // NOTE: Telemetry is enabled by default. diff --git a/src/Aspire.Hosting/ApplicationModel/DistributedApplicationComponent.cs b/src/Aspire.Hosting/ApplicationModel/DistributedApplicationComponent.cs index d5e1e3e387f..b3ab647389f 100644 --- a/src/Aspire.Hosting/ApplicationModel/DistributedApplicationComponent.cs +++ b/src/Aspire.Hosting/ApplicationModel/DistributedApplicationComponent.cs @@ -13,7 +13,6 @@ public abstract class DistributedApplicationComponent(string name) : IDistribute private string DebuggerToString() { - DistributedApplicationComponentExtensions.TryGetName(this, out var name); - return $@"Type = {GetType().Name}, Name = ""{name}"""; + return $@"Type = {GetType().Name}, Name = ""{Name}"""; } } diff --git a/src/Aspire.Hosting/ApplicationModel/DistributedApplicationComponentExtensions.cs b/src/Aspire.Hosting/ApplicationModel/DistributedApplicationComponentExtensions.cs index 7126a300ec5..9b8529e4c6c 100644 --- a/src/Aspire.Hosting/ApplicationModel/DistributedApplicationComponentExtensions.cs +++ b/src/Aspire.Hosting/ApplicationModel/DistributedApplicationComponentExtensions.cs @@ -7,13 +7,6 @@ namespace Aspire.Hosting.ApplicationModel; public static class DistributedApplicationComponentExtensions { - public static bool TryGetName(this IDistributedApplicationComponent component, [NotNullWhen(true)] out string? name) - { - var result = component.TryGetLastAnnotation(out var nameAnnotation); - name = nameAnnotation?.Name; - return result; - } - public static bool TryGetLastAnnotation(this IDistributedApplicationComponent component, [NotNullWhen(true)] out T? annotation) where T : IDistributedApplicationComponentAnnotation { if (component.Annotations.OfType().LastOrDefault() is { } lastAnnotation) @@ -77,10 +70,6 @@ public static bool TryGetContainerImageName(this IDistributedApplicationComponen imageName = null; return false; } - public static bool HasName(this IDistributedApplicationComponent component, string name) - { - return component.TryGetName(out var componentName) && componentName == name; - } public static int GetReplicaCount(this IDistributedApplicationComponent component) { diff --git a/src/Aspire.Hosting/ApplicationModel/NameAnnotation.cs b/src/Aspire.Hosting/ApplicationModel/NameAnnotation.cs deleted file mode 100644 index b8a8d7769dc..00000000000 --- a/src/Aspire.Hosting/ApplicationModel/NameAnnotation.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Diagnostics; - -namespace Aspire.Hosting.ApplicationModel; - -[DebuggerDisplay("Type = {GetType().Name,nq}, Name = {Name}")] -public sealed class NameAnnotation : IDistributedApplicationComponentAnnotation -{ - public required string Name { get; set; } -} diff --git a/src/Aspire.Hosting/ComponentBuilderExtensions.cs b/src/Aspire.Hosting/ComponentBuilderExtensions.cs index aab92f2842c..9ca344e600f 100644 --- a/src/Aspire.Hosting/ComponentBuilderExtensions.cs +++ b/src/Aspire.Hosting/ComponentBuilderExtensions.cs @@ -17,11 +17,6 @@ public static IDistributedApplicationComponentBuilder WithEnvironment(this return builder.WithAnnotation(new EnvironmentCallbackAnnotation(name, () => value ?? string.Empty)); } - public static IDistributedApplicationComponentBuilder WithName(this IDistributedApplicationComponentBuilder builder, string name) where T : IDistributedApplicationComponent - { - return builder.WithAnnotation(new NameAnnotation { Name = name }); - } - public static IDistributedApplicationComponentBuilder WithEnvironment(this IDistributedApplicationComponentBuilder builder, string name, Func callback) where T : IDistributedApplicationComponentWithEnvironment { return builder.WithAnnotation(new EnvironmentCallbackAnnotation(name, callback)); @@ -42,10 +37,7 @@ private static Action CreateServiceReferenceEnvironm { return (context) => { - if (!serviceReferencesAnnotation.Component.TryGetName(out var name)) - { - throw new InvalidOperationException("When referencing component as an endpoint you must specify a name using WithName(string) on the referenced project."); - } + var name = serviceReferencesAnnotation.Component.Name; var allocatedEndPoints = serviceReferencesAnnotation.Component.Annotations .OfType() diff --git a/src/Aspire.Hosting/Dcp/ApplicationExecutor.cs b/src/Aspire.Hosting/Dcp/ApplicationExecutor.cs index bdac8e02ea2..04fbe188f21 100644 --- a/src/Aspire.Hosting/Dcp/ApplicationExecutor.cs +++ b/src/Aspire.Hosting/Dcp/ApplicationExecutor.cs @@ -441,9 +441,7 @@ private void PrepareContainers() throw new InvalidOperationException(); } - var computedContainerName = container.TryGetName(out var specifiedContainerName) ? specifiedContainerName : containerImageName; - // TODO: the image name is really not the best name for Container object; we should use a "service name" or "component name" - var ctr = Container.Create(computedContainerName, containerImageName); + var ctr = Container.Create(container.Name, containerImageName); if (container.TryGetVolumeMounts(out var volumeMounts)) { @@ -630,48 +628,7 @@ public void Dispose() private static string GetObjectNameForComponent(IDistributedApplicationComponent component, string suffix = "") { string maybeWithSuffix(string s) => string.IsNullOrWhiteSpace(suffix) ? s : $"{s}_{suffix}"; - - if (component.TryGetName(out var name)) - { - return maybeWithSuffix(name); - } - - switch (component) - { - case ContainerComponent: - if (!component.TryGetContainerImageName(out var imageName)) - { - throw new ArgumentException("The container component has no name and no image information."); // Should never happen. - } - - if (Rules.IsValidObjectName(imageName)) - { - return maybeWithSuffix(imageName); - } - else - { - throw new ArgumentException($"Could not determine a good name for container component using image '{imageName}'; use WithName() on the container to fix this issue."); - } - - case ProjectComponent: - if (!component.TryGetLastAnnotation(out var projectMetadata)) - { - throw new ArgumentException("The project component has no name and no project metadata"); // Should never happen. - } - - // TODO: the assembly name is really not the best name for Executable object (should use project name probably). - if (Rules.IsValidObjectName(projectMetadata.AssemblyName)) - { - return maybeWithSuffix(projectMetadata.AssemblyName); - } - else - { - throw new ArgumentException($"Could not determine a good name for project component with assembly name '{projectMetadata.AssemblyName}'; use WithName() on the project to fix this issue."); - } - - default: - throw new ArgumentException($"Could not determine a good name for component of type {component.GetType().Name}"); - } + return maybeWithSuffix(component.Name); } private static string GenerateUniqueServiceName(List serviceNames, string candidateName) diff --git a/src/Aspire.Hosting/DistributedApplicationBuilder.cs b/src/Aspire.Hosting/DistributedApplicationBuilder.cs index f4ed274f9d4..0a9e77b24a5 100644 --- a/src/Aspire.Hosting/DistributedApplicationBuilder.cs +++ b/src/Aspire.Hosting/DistributedApplicationBuilder.cs @@ -86,7 +86,6 @@ public IDistributedApplicationComponentBuilder AddComponent(T component) w { Components.Add(component); var builder = new DistributedApplicationComponentBuilder(this, component); - builder.WithName(component.Name); // TODO: Remove when fully transitioned Name away from annotation. componentBuilders.Add(component, builder); return builder; } diff --git a/src/Aspire.Hosting/Publishing/ManifestPublisher.cs b/src/Aspire.Hosting/Publishing/ManifestPublisher.cs index 9c97bed2c83..6e1dd95a235 100644 --- a/src/Aspire.Hosting/Publishing/ManifestPublisher.cs +++ b/src/Aspire.Hosting/Publishing/ManifestPublisher.cs @@ -50,12 +50,7 @@ private void WriteComponents(DistributedApplicationModel model, Utf8JsonWriter j private void WriteComponent(IDistributedApplicationComponent component, Utf8JsonWriter jsonWriter) { - if (!component.TryGetName(out var componentName)) - { - throw new DistributedApplicationException("Component did not have name!"); - } - - jsonWriter.WriteStartObject(componentName); + jsonWriter.WriteStartObject(component.Name); // First see if the component has a callback annotation with overrides the behavior for rendering // out the JSON. If so use that callback, otherwise use the fallback logic that we have.