diff --git a/src/Aspire.Hosting/ComponentBuilderExtensions.cs b/src/Aspire.Hosting/ComponentBuilderExtensions.cs index aab92f2842c..8f73075b997 100644 --- a/src/Aspire.Hosting/ComponentBuilderExtensions.cs +++ b/src/Aspire.Hosting/ComponentBuilderExtensions.cs @@ -2,11 +2,14 @@ // The .NET Foundation licenses this file to you under the MIT license. using Aspire.Hosting.ApplicationModel; +using Microsoft.Extensions.Configuration; namespace Aspire.Hosting; public static class ComponentBuilderExtensions { + private const string ConnectionStringEnvironmentName = "ConnectionStrings__"; + public static AllocatedEndpointAnnotation? GetEndpoint(this IDistributedApplicationComponentBuilder builder, string name) where T : IDistributedApplicationComponent { return builder.Component.Annotations.OfType().SingleOrDefault(); @@ -68,28 +71,32 @@ private static Action CreateServiceReferenceEnvironm }; } - public static IDistributedApplicationComponentBuilder WithReference(this IDistributedApplicationComponentBuilder builder, IDistributedApplicationComponentBuilder source) + public static IDistributedApplicationComponentBuilder WithReference(this IDistributedApplicationComponentBuilder builder, IDistributedApplicationComponentBuilder source, string? connectionName = null) where TDestination : IDistributedApplicationComponentWithEnvironment where TSource : IDistributedApplicationComponentWithConnectionString { - var connectionName = $"ConnectionStrings__{source.Component.Name}"; + var component = source.Component; + connectionName ??= component.Name; return builder.WithEnvironment(context => { + var connectionStringName = $"{ConnectionStringEnvironmentName}{connectionName}"; + if (context.PublisherName == "manifest") { - context.EnvironmentVariables[connectionName] = $"{{{source.Component.Name}.connectionString}}"; + context.EnvironmentVariables[connectionStringName] = $"{{{component.Name}.connectionString}}"; return; } - var connectionString = source.Component.GetConnectionString(); + var connectionString = component.GetConnectionString() ?? + builder.ApplicationBuilder.Configuration.GetConnectionString(component.Name); if (string.IsNullOrEmpty(connectionString)) { - throw new DistributedApplicationException($"A connection string for '{source.Component.Name}' could not be retrieved."); + throw new DistributedApplicationException($"A connection string for '{component.Name}' could not be retrieved."); } - context.EnvironmentVariables[connectionName] = connectionString; + context.EnvironmentVariables[connectionStringName] = connectionString; }); } diff --git a/src/Aspire.Hosting/Postgres/PostgresBuilderExtensions.cs b/src/Aspire.Hosting/Postgres/PostgresBuilderExtensions.cs index 7b369f5924d..b9c76660a0b 100644 --- a/src/Aspire.Hosting/Postgres/PostgresBuilderExtensions.cs +++ b/src/Aspire.Hosting/Postgres/PostgresBuilderExtensions.cs @@ -4,6 +4,7 @@ using System.Net.Sockets; using System.Text.Json; using Aspire.Hosting.ApplicationModel; +using Microsoft.Extensions.Configuration; namespace Aspire.Hosting.Postgres; @@ -32,7 +33,7 @@ public static IDistributedApplicationComponentBuilder AddPostgres(this IDistributedApplicationBuilder builder, string name, string? connectionString) + public static IDistributedApplicationComponentBuilder AddPostgres(this IDistributedApplicationBuilder builder, string name, string? connectionString = null) { var postgres = new PostgresComponent(name, connectionString); @@ -60,7 +61,7 @@ public static IDistributedApplicationComponentBuilder WithPostgresDatabase where T : IDistributedApplicationComponentWithEnvironment { var postgres = postgresBuilder.Component; - connectionName = connectionName ?? postgresBuilder.Component.Name; + connectionName ??= postgresBuilder.Component.Name; return builder.WithEnvironment((context) => { @@ -72,11 +73,14 @@ public static IDistributedApplicationComponentBuilder WithPostgresDatabase return; } - var connectionString = postgres.GetConnectionString(databaseName); + var connectionString = postgres.GetConnectionString(databaseName) ?? + builder.ApplicationBuilder.Configuration.GetConnectionString(postgres.Name); + if (string.IsNullOrEmpty(connectionString)) { throw new DistributedApplicationException($"A connection string for Postgres '{postgres.Name}' could not be retrieved."); } + context.EnvironmentVariables[connectionStringName] = connectionString; }); } diff --git a/src/Aspire.Hosting/Redis/RedisBuilderExtensions.cs b/src/Aspire.Hosting/Redis/RedisBuilderExtensions.cs index e1e7659303b..6c778955c24 100644 --- a/src/Aspire.Hosting/Redis/RedisBuilderExtensions.cs +++ b/src/Aspire.Hosting/Redis/RedisBuilderExtensions.cs @@ -20,7 +20,7 @@ public static IDistributedApplicationComponentBuilder A return componentBuilder; } - public static IDistributedApplicationComponentBuilder AddRedis(this IDistributedApplicationBuilder builder, string name, string? connectionString) + public static IDistributedApplicationComponentBuilder AddRedis(this IDistributedApplicationBuilder builder, string name, string? connectionString = null) { var redis = new RedisComponent(name, connectionString); @@ -44,6 +44,6 @@ private static void WriteRedisComponentToManifest(Utf8JsonWriter jsonWriter, str public static IDistributedApplicationComponentBuilder WithRedis(this IDistributedApplicationComponentBuilder builder, IDistributedApplicationComponentBuilder redisBuilder, string? connectionName = null) where T : IDistributedApplicationComponentWithEnvironment { - return builder.WithReference(redisBuilder); + return builder.WithReference(redisBuilder, connectionName); } } diff --git a/src/Aspire.Hosting/SqlServer/SqlServerBuilderExtensions.cs b/src/Aspire.Hosting/SqlServer/SqlServerBuilderExtensions.cs index 432061cfcc9..4e7e243ec8f 100644 --- a/src/Aspire.Hosting/SqlServer/SqlServerBuilderExtensions.cs +++ b/src/Aspire.Hosting/SqlServer/SqlServerBuilderExtensions.cs @@ -4,6 +4,7 @@ using System.Net.Sockets; using System.Text.Json; using Aspire.Hosting.ApplicationModel; +using Microsoft.Extensions.Configuration; namespace Aspire.Hosting.SqlServer; @@ -24,7 +25,7 @@ public static IDistributedApplicationComponentBuilder AddSqlServer(this IDistributedApplicationBuilder builder, string name, string? connectionString) + public static IDistributedApplicationComponentBuilder AddSqlServer(this IDistributedApplicationBuilder builder, string name, string? connectionString = null) { var sqlServer = new SqlServerComponent(name, connectionString); @@ -49,7 +50,7 @@ public static IDistributedApplicationComponentBuilder WithSqlServer(this I where T : IDistributedApplicationComponentWithEnvironment { var sql = sqlBuilder.Component; - connectionName = connectionName ?? sqlBuilder.Component.Name; + connectionName ??= sqlBuilder.Component.Name; return builder.WithEnvironment((context) => { @@ -61,11 +62,14 @@ public static IDistributedApplicationComponentBuilder WithSqlServer(this I return; } - var connectionString = sql.GetConnectionString(databaseName); + var connectionString = sql.GetConnectionString(databaseName) ?? + builder.ApplicationBuilder.Configuration.GetConnectionString(sql.Name); + if (string.IsNullOrEmpty(connectionString)) { throw new DistributedApplicationException($"A connection string for SqlServer '{sql.Name}' could not be retrieved."); } + context.EnvironmentVariables[connectionStringName] = connectionString; }); }