Skip to content

Commit e933788

Browse files
Copilotaaronpowell
andauthored
Implement GetConnectionProperties for new connection string formatting (#916)
* baseline branch for the next major release * Initial plan * Implement GetConnectionProperties for all IResourceWithConnectionString resources Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com> * Updating nightly * Remove deprecated IDistributedApplicationLifecycleHook interface (#915) * Initial plan * Replace IDistributedApplicationLifecycleHook with event-based patterns Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com> * Add tests for installer resources and update Dapr tests Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com> * Refactor Dapr to use IDistributedApplicationEventingSubscriber Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com> * Fixing build issue * Updating the endpoint port * Disabling some tests so we can move forward in other parts of the Aspire 13 update --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com> Co-authored-by: Aaron Powell <me@aaron-powell.com> * Adjusting the version of keycloak * Updating aspire nightly * New nightly * Handling url encoding * Remove npm functionality moved to Aspire 13 (#928) * Initial plan * Remove AddViteApp and npm-specific functionality (moved to Aspire 13) Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com> * Update comments and tests to reflect npm removal Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com> * Update MONOREPO.md to remove npm references Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com> * Adding missing types * Bad copilot code * Fixing missing namespace * Handling port forwarding * removing more stuff that has been migrated to aspire core * Reworking how package installing is handled * daily update * Adding back the annotation that is no longer moving to core * Forgot to install packages * adding a bunch more annotations to provide enough metadata * Removing old demo apps * Disabling python tests * Removing a testing change * Updating to the latest nightly and dealing with type name changes * Removing type that was can repurpose from aspire core * breaking the tests down so they are easier to read * Removing legacy docs * Fixing failing tests --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com> Co-authored-by: Aaron Powell <me@aaron-powell.com> * Fixing failing test * Add GetConnectionProperties implementation to MinioContainerResource Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com> * Add GetConnectionProperties to KurrentDB and LavinMQ resources Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com> * Handling uri encoding which requires a reference expression wrapper * Don't need to escape in the connection string as we now encode properly * Reverting some changes that weren't needed * Fixing minio encoding in tests * Removing URL encoding as the client doesn't decode it * forgot to revert some changes in tests --------- Co-authored-by: Aaron Powell <me@aaron-powell.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com>
1 parent 416a98a commit e933788

File tree

22 files changed

+445
-33
lines changed

22 files changed

+445
-33
lines changed

src/CommunityToolkit.Aspire.Hosting.ActiveMQ/ActiveMQServerResourceBase.cs

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,23 @@ public abstract class ActiveMQServerResourceBase(string name, ParameterResource?
2222
/// <inheritdoc />
2323
public ReferenceExpression ConnectionStringExpression =>
2424
ReferenceExpression.Create(
25-
$"{scheme}://{UserNameReference}:{PasswordParameter}@{PrimaryEndpoint.Property(EndpointProperty.Host)}:{PrimaryEndpoint.Property(EndpointProperty.Port)}");
25+
$"{scheme}://{UserNameReference}:{PasswordParameter:uri}@{PrimaryEndpoint.Property(EndpointProperty.Host)}:{PrimaryEndpoint.Property(EndpointProperty.Port)}");
2626

2727
/// <summary>
2828
/// Gets the primary endpoint for the ActiveMQ server.
2929
/// </summary>
3030
public EndpointReference PrimaryEndpoint => _primaryEndpoint ??= new EndpointReference(this, PrimaryEndpointName);
3131

32+
/// <summary>
33+
/// Gets the host endpoint reference for this resource.
34+
/// </summary>
35+
public EndpointReferenceExpression Host => PrimaryEndpoint.Property(EndpointProperty.Host);
36+
37+
/// <summary>
38+
/// Gets the port endpoint reference for this resource.
39+
/// </summary>
40+
public EndpointReferenceExpression Port => PrimaryEndpoint.Property(EndpointProperty.Port);
41+
3242
/// <summary>
3343
/// Gets the parameter that contains the ActiveMQ server username.
3444
/// </summary>
@@ -49,7 +59,24 @@ public abstract class ActiveMQServerResourceBase(string name, ParameterResource?
4959
UserNameParameter is not null ?
5060
ReferenceExpression.Create($"{UserNameParameter}") :
5161
ReferenceExpression.Create($"{DefaultUserName}");
52-
62+
63+
/// <summary>
64+
/// Gets the connection URI expression for the ActiveMQ server.
65+
/// </summary>
66+
/// <remarks>
67+
/// Format: <c>{scheme}://{user}:{password}@{host}:{port}</c>.
68+
/// </remarks>
69+
public ReferenceExpression UriExpression => ConnectionStringExpression;
70+
71+
IEnumerable<KeyValuePair<string, ReferenceExpression>> IResourceWithConnectionString.GetConnectionProperties()
72+
{
73+
yield return new("Host", ReferenceExpression.Create($"{Host}"));
74+
yield return new("Port", ReferenceExpression.Create($"{Port}"));
75+
yield return new("Username", UserNameReference);
76+
yield return new("Password", ReferenceExpression.Create($"{PasswordParameter}"));
77+
yield return new("Uri", UriExpression);
78+
}
79+
5380
private static T ThrowIfNull<T>([NotNull] T? argument, [CallerArgumentExpression(nameof(argument))] string? paramName = null)
5481
=> argument ?? throw new ArgumentNullException(paramName);
5582
}

src/CommunityToolkit.Aspire.Hosting.Flagd/FlagdResource.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,16 @@ public class FlagdResource(string name) : ContainerResource(name), IResourceWith
2424
/// </summary>
2525
public EndpointReference PrimaryEndpoint => _primaryEndpointReference ??= new(this, HttpEndpointName);
2626

27+
/// <summary>
28+
/// Gets the host endpoint reference for this resource.
29+
/// </summary>
30+
public EndpointReferenceExpression Host => PrimaryEndpoint.Property(EndpointProperty.Host);
31+
32+
/// <summary>
33+
/// Gets the port endpoint reference for this resource.
34+
/// </summary>
35+
public EndpointReferenceExpression Port => PrimaryEndpoint.Property(EndpointProperty.Port);
36+
2737
/// <summary>
2838
/// Gets the health check HTTP endpoint for the flagd server.
2939
/// </summary>
@@ -41,4 +51,19 @@ public class FlagdResource(string name) : ContainerResource(name), IResourceWith
4151
ReferenceExpression.Create(
4252
$"{PrimaryEndpoint.Property(EndpointProperty.Scheme)}://{PrimaryEndpoint.Property(EndpointProperty.Host)}:{PrimaryEndpoint.Property(EndpointProperty.Port)}"
4353
);
54+
55+
/// <summary>
56+
/// Gets the connection URI expression for the flagd server.
57+
/// </summary>
58+
/// <remarks>
59+
/// Format: <c>http://{host}:{port}</c>.
60+
/// </remarks>
61+
public ReferenceExpression UriExpression => ConnectionStringExpression;
62+
63+
IEnumerable<KeyValuePair<string, ReferenceExpression>> IResourceWithConnectionString.GetConnectionProperties()
64+
{
65+
yield return new("Host", ReferenceExpression.Create($"{Host}"));
66+
yield return new("Port", ReferenceExpression.Create($"{Port}"));
67+
yield return new("Uri", UriExpression);
68+
}
4469
}

src/CommunityToolkit.Aspire.Hosting.GoFeatureFlag/GoFeatureFlagResource.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,34 @@ public class GoFeatureFlagResource(string name) : ContainerResource(name), IReso
1818
/// </summary>
1919
public EndpointReference PrimaryEndpoint => _primaryEndpoint ??= new(this, PrimaryEndpointName);
2020

21+
/// <summary>
22+
/// Gets the host endpoint reference for this resource.
23+
/// </summary>
24+
public EndpointReferenceExpression Host => PrimaryEndpoint.Property(EndpointProperty.Host);
25+
26+
/// <summary>
27+
/// Gets the port endpoint reference for this resource.
28+
/// </summary>
29+
public EndpointReferenceExpression Port => PrimaryEndpoint.Property(EndpointProperty.Port);
30+
2131
/// <summary>
2232
/// Gets the connection string expression for the GO Feature Flag instance.
2333
/// </summary>
2434
public ReferenceExpression ConnectionStringExpression =>
2535
ReferenceExpression.Create($"Endpoint=http://{PrimaryEndpoint.Property(EndpointProperty.Host)}:{PrimaryEndpoint.Property(EndpointProperty.Port)}");
36+
37+
/// <summary>
38+
/// Gets the connection URI expression for the GO Feature Flag instance.
39+
/// </summary>
40+
/// <remarks>
41+
/// Format: <c>http://{host}:{port}</c>.
42+
/// </remarks>
43+
public ReferenceExpression UriExpression => ReferenceExpression.Create($"http://{Host}:{Port}");
44+
45+
IEnumerable<KeyValuePair<string, ReferenceExpression>> IResourceWithConnectionString.GetConnectionProperties()
46+
{
47+
yield return new("Host", ReferenceExpression.Create($"{Host}"));
48+
yield return new("Port", ReferenceExpression.Create($"{Port}"));
49+
yield return new("Uri", UriExpression);
50+
}
2651
}

src/CommunityToolkit.Aspire.Hosting.KurrentDB/KurrentDBResource.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,35 @@ public class KurrentDBResource(string name) : ContainerResource(name), IResource
1919
/// </summary>
2020
public EndpointReference PrimaryEndpoint => _primaryEndpoint ??= new(this, HttpEndpointName);
2121

22+
/// <summary>
23+
/// Gets the host endpoint reference for this resource.
24+
/// </summary>
25+
public EndpointReferenceExpression Host => PrimaryEndpoint.Property(EndpointProperty.Host);
26+
27+
/// <summary>
28+
/// Gets the port endpoint reference for this resource.
29+
/// </summary>
30+
public EndpointReferenceExpression Port => PrimaryEndpoint.Property(EndpointProperty.Port);
31+
2232
/// <summary>
2333
/// Gets the connection string for the KurrentDB server.
2434
/// </summary>
2535
public ReferenceExpression ConnectionStringExpression =>
2636
ReferenceExpression.Create(
2737
$"kurrentdb://{PrimaryEndpoint.Property(EndpointProperty.Host)}:{PrimaryEndpoint.Property(EndpointProperty.Port)}?tls=false");
38+
39+
/// <summary>
40+
/// Gets the connection URI expression for the KurrentDB server.
41+
/// </summary>
42+
/// <remarks>
43+
/// Format: <c>kurrentdb://{host}:{port}?tls=false</c>.
44+
/// </remarks>
45+
public ReferenceExpression UriExpression => ConnectionStringExpression;
46+
47+
IEnumerable<KeyValuePair<string, ReferenceExpression>> IResourceWithConnectionString.GetConnectionProperties()
48+
{
49+
yield return new("Host", ReferenceExpression.Create($"{Host}"));
50+
yield return new("Port", ReferenceExpression.Create($"{Port}"));
51+
yield return new("Uri", UriExpression);
52+
}
2853
}

src/CommunityToolkit.Aspire.Hosting.LavinMQ/LavinMQContainerResource.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,16 @@ public class LavinMQContainerResource(string name)
2020
private EndpointReference? _primaryEndpoint;
2121
private EndpointReference PrimaryEndpoint => _primaryEndpoint ??= new EndpointReference(this, PrimaryEndpointName);
2222

23+
/// <summary>
24+
/// Gets the host endpoint reference for this resource.
25+
/// </summary>
26+
public EndpointReferenceExpression Host => PrimaryEndpoint.Property(EndpointProperty.Host);
27+
28+
/// <summary>
29+
/// Gets the port endpoint reference for this resource.
30+
/// </summary>
31+
public EndpointReferenceExpression Port => PrimaryEndpoint.Property(EndpointProperty.Port);
32+
2333
private static ReferenceExpression UserNameReference => ReferenceExpression.Create($"{DefaultUserName}");
2434

2535
private static ReferenceExpression PasswordReference => ReferenceExpression.Create($"{DefaultPassword}");
@@ -29,4 +39,21 @@ public class LavinMQContainerResource(string name)
2939
/// </summary>
3040
public ReferenceExpression ConnectionStringExpression =>
3141
ReferenceExpression.Create($"amqp://{UserNameReference}:{PasswordReference}@{PrimaryEndpoint.Property(EndpointProperty.Host)}:{PrimaryEndpoint.Property(EndpointProperty.Port)}/");
42+
43+
/// <summary>
44+
/// Gets the connection URI expression for the LavinMQ server.
45+
/// </summary>
46+
/// <remarks>
47+
/// Format: <c>amqp://{user}:{password}@{host}:{port}/</c>.
48+
/// </remarks>
49+
public ReferenceExpression UriExpression => ConnectionStringExpression;
50+
51+
IEnumerable<KeyValuePair<string, ReferenceExpression>> IResourceWithConnectionString.GetConnectionProperties()
52+
{
53+
yield return new("Host", ReferenceExpression.Create($"{Host}"));
54+
yield return new("Port", ReferenceExpression.Create($"{Port}"));
55+
yield return new("Username", UserNameReference);
56+
yield return new("Password", PasswordReference);
57+
yield return new("Uri", UriExpression);
58+
}
3259
}

src/CommunityToolkit.Aspire.Hosting.MailPit/MailPitContainerResource.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,34 @@ public class MailPitContainerResource(string name) : ContainerResource(name), IR
1515
private EndpointReference? _smtpEndpoint;
1616
private EndpointReference SmtpEndpoint => _smtpEndpoint ??= new EndpointReference(this, SmtpEndpointName);
1717

18+
/// <summary>
19+
/// Gets the host endpoint reference for the SMTP endpoint.
20+
/// </summary>
21+
public EndpointReferenceExpression Host => SmtpEndpoint.Property(EndpointProperty.Host);
22+
23+
/// <summary>
24+
/// Gets the port endpoint reference for the SMTP endpoint.
25+
/// </summary>
26+
public EndpointReferenceExpression Port => SmtpEndpoint.Property(EndpointProperty.Port);
27+
1828
/// <summary>
1929
/// ConnectionString for MailPit smtp endpoint in the form of smtp://host:port.
2030
/// </summary>
2131
public ReferenceExpression ConnectionStringExpression => ReferenceExpression.Create(
2232
$"Endpoint={SmtpEndpoint.Scheme}://{SmtpEndpoint.Property(EndpointProperty.Host)}:{SmtpEndpoint.Property(EndpointProperty.Port)}");
33+
34+
/// <summary>
35+
/// Gets the connection URI expression for the MailPit SMTP endpoint.
36+
/// </summary>
37+
/// <remarks>
38+
/// Format: <c>smtp://{host}:{port}</c>.
39+
/// </remarks>
40+
public ReferenceExpression UriExpression => ReferenceExpression.Create($"{SmtpEndpoint.Scheme}://{Host}:{Port}");
41+
42+
IEnumerable<KeyValuePair<string, ReferenceExpression>> IResourceWithConnectionString.GetConnectionProperties()
43+
{
44+
yield return new("Host", ReferenceExpression.Create($"{Host}"));
45+
yield return new("Port", ReferenceExpression.Create($"{Port}"));
46+
yield return new("Uri", UriExpression);
47+
}
2348
}

src/CommunityToolkit.Aspire.Hosting.Meilisearch/MeilisearchResource.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,16 @@ public MeilisearchResource(string name, ParameterResource masterKey) : base(name
2222
/// </summary>
2323
public EndpointReference PrimaryEndpoint => _primaryEndpoint ??= new(this, PrimaryEndpointName);
2424

25+
/// <summary>
26+
/// Gets the host endpoint reference for this resource.
27+
/// </summary>
28+
public EndpointReferenceExpression Host => PrimaryEndpoint.Property(EndpointProperty.Host);
29+
30+
/// <summary>
31+
/// Gets the port endpoint reference for this resource.
32+
/// </summary>
33+
public EndpointReferenceExpression Port => PrimaryEndpoint.Property(EndpointProperty.Port);
34+
2535
/// <summary>
2636
/// Gets the parameter that contains the Meilisearch superuser password.
2737
/// </summary>
@@ -32,5 +42,21 @@ public MeilisearchResource(string name, ParameterResource masterKey) : base(name
3242
/// </summary>
3343
public ReferenceExpression ConnectionStringExpression =>
3444
ReferenceExpression.Create($"Endpoint=http://{PrimaryEndpoint.Property(EndpointProperty.Host)}:{PrimaryEndpoint.Property(EndpointProperty.Port)};MasterKey={MasterKeyParameter}");
45+
46+
/// <summary>
47+
/// Gets the connection URI expression for the Meilisearch server.
48+
/// </summary>
49+
/// <remarks>
50+
/// Format: <c>http://{host}:{port}</c>.
51+
/// </remarks>
52+
public ReferenceExpression UriExpression => ReferenceExpression.Create($"http://{Host}:{Port}");
53+
54+
IEnumerable<KeyValuePair<string, ReferenceExpression>> IResourceWithConnectionString.GetConnectionProperties()
55+
{
56+
yield return new("Host", ReferenceExpression.Create($"{Host}"));
57+
yield return new("Port", ReferenceExpression.Create($"{Port}"));
58+
yield return new("MasterKey", ReferenceExpression.Create($"{MasterKeyParameter}"));
59+
yield return new("Uri", UriExpression);
60+
}
3561
}
3662

src/CommunityToolkit.Aspire.Hosting.Minio/MinioContainerResource.cs

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,30 @@ public sealed class MinioContainerResource(string name, ParameterResource rootUs
2929
/// Gets the primary endpoint for the MinIO. This endpoint is used for all API calls over HTTP.
3030
/// </summary>
3131
public EndpointReference PrimaryEndpoint => _primaryEndpoint ??= new(this, PrimaryEndpointName);
32-
32+
33+
/// <summary>
34+
/// Gets the host endpoint reference for this resource.
35+
/// </summary>
36+
public EndpointReferenceExpression Host => PrimaryEndpoint.Property(EndpointProperty.Host);
37+
38+
/// <summary>
39+
/// Gets the port endpoint reference for this resource.
40+
/// </summary>
41+
public EndpointReferenceExpression Port => PrimaryEndpoint.Property(EndpointProperty.Port);
42+
3343
/// <summary>
3444
/// Gets the connection string expression for the Minio
3545
/// </summary>
3646
public ReferenceExpression ConnectionStringExpression => GetConnectionString();
37-
47+
48+
/// <summary>
49+
/// Gets the connection URI expression for the MinIO server.
50+
/// </summary>
51+
/// <remarks>
52+
/// Format: <c>http://{host}:{port}</c>.
53+
/// </remarks>
54+
public ReferenceExpression UriExpression => ReferenceExpression.Create($"http://{Host}:{Port}");
55+
3856
/// <summary>
3957
/// Gets the connection string for the MinIO server.
4058
/// </summary>
@@ -49,7 +67,7 @@ public sealed class MinioContainerResource(string name, ParameterResource rootUs
4967

5068
return ConnectionStringExpression.GetValueAsync(cancellationToken);
5169
}
52-
70+
5371
/// <summary>
5472
/// Gets the connection string for the MinIO server.
5573
/// </summary>
@@ -70,4 +88,13 @@ internal void SetPassword(ParameterResource password)
7088
{
7189
PasswordParameter = password;
7290
}
91+
92+
IEnumerable<KeyValuePair<string, ReferenceExpression>> IResourceWithConnectionString.GetConnectionProperties()
93+
{
94+
yield return new("Host", ReferenceExpression.Create($"{Host}"));
95+
yield return new("Port", ReferenceExpression.Create($"{Port}"));
96+
yield return new("AccessKey", ReferenceExpression.Create($"{RootUser}"));
97+
yield return new("SecretKey", ReferenceExpression.Create($"{PasswordParameter}"));
98+
yield return new("Uri", UriExpression);
99+
}
73100
}

src/CommunityToolkit.Aspire.Hosting.Ollama/OllamaModelResource.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ public class OllamaModelResource(string name, string modelName, OllamaResource p
2626
/// </summary>
2727
public string ModelName { get; } = ThrowIfNull(modelName);
2828

29+
IEnumerable<KeyValuePair<string, ReferenceExpression>> IResourceWithConnectionString.GetConnectionProperties() =>
30+
Parent.CombineProperties([
31+
new("Model", ReferenceExpression.Create($"{ModelName}"))
32+
]);
33+
2934
private static T ThrowIfNull<T>([NotNull] T? argument, [CallerArgumentExpression(nameof(argument))] string? paramName = null)
3035
=> argument ?? throw new ArgumentNullException(paramName);
3136
}

src/CommunityToolkit.Aspire.Hosting.Ollama/OllamaResource.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,16 @@ public class OllamaResource(string name) : ContainerResource(name), IResourceWit
2525
/// </summary>
2626
public EndpointReference PrimaryEndpoint => _primaryEndpointReference ??= new(this, OllamaEndpointName);
2727

28+
/// <summary>
29+
/// Gets the host endpoint reference for this resource.
30+
/// </summary>
31+
public EndpointReferenceExpression Host => PrimaryEndpoint.Property(EndpointProperty.Host);
32+
33+
/// <summary>
34+
/// Gets the port endpoint reference for this resource.
35+
/// </summary>
36+
public EndpointReferenceExpression Port => PrimaryEndpoint.Property(EndpointProperty.Port);
37+
2838
/// <summary>
2939
/// Gets the connection string expression for the Ollama server.
3040
/// </summary>
@@ -33,6 +43,14 @@ public class OllamaResource(string name) : ContainerResource(name), IResourceWit
3343
$"Endpoint={PrimaryEndpoint.Property(EndpointProperty.Scheme)}://{PrimaryEndpoint.Property(EndpointProperty.Host)}:{PrimaryEndpoint.Property(EndpointProperty.Port)}"
3444
);
3545

46+
/// <summary>
47+
/// Gets the connection URI expression for the Ollama server.
48+
/// </summary>
49+
/// <remarks>
50+
/// Format: <c>http://{host}:{port}</c>.
51+
/// </remarks>
52+
public ReferenceExpression UriExpression => ReferenceExpression.Create($"{PrimaryEndpoint.Property(EndpointProperty.Scheme)}://{Host}:{Port}");
53+
3654
/// <summary>
3755
/// Adds a model to the list of models to download on initial startup.
3856
/// </summary>
@@ -45,4 +63,11 @@ public void AddModel(string modelName)
4563
_models.Add(modelName);
4664
}
4765
}
66+
67+
IEnumerable<KeyValuePair<string, ReferenceExpression>> IResourceWithConnectionString.GetConnectionProperties()
68+
{
69+
yield return new("Host", ReferenceExpression.Create($"{Host}"));
70+
yield return new("Port", ReferenceExpression.Create($"{Port}"));
71+
yield return new("Uri", UriExpression);
72+
}
4873
}

0 commit comments

Comments
 (0)