Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions playground/Redis/Redis.AppHost/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

var redis = builder.AddRedis("redis");
redis.WithDataVolume()
.WithRedisCommander(c => c.WithHostPort(33803).WithParentRelationship(redis.Resource))
.WithRedisInsight(c => c.WithHostPort(41567).WithParentRelationship(redis.Resource));
.WithRedisCommander(c => c.WithHostPort(33803).WithParentRelationship(redis))
.WithRedisInsight(c => c.WithHostPort(41567).WithParentRelationship(redis));

var garnet = builder.AddGarnet("garnet")
.WithDataVolume();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,7 @@ public static IResourceBuilder<AzureEventHubsResource> RunAsEmulator(this IResou
// Create a separate storage emulator for the Event Hub one
var storageResource = builder.ApplicationBuilder
.AddAzureStorage($"{builder.Resource.Name}-storage")
.WithParentRelationship(builder.Resource);
.WithParentRelationship(builder);

var lifetime = ContainerLifetime.Session;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -347,7 +347,7 @@ public static IResourceBuilder<AzureServiceBusResource> RunAsEmulator(this IReso
{
context.EnvironmentVariables["MSSQL_SA_PASSWORD"] = passwordParameter;
})
.WithParentRelationship(builder.Resource);
.WithParentRelationship(builder);

builder.WithAnnotation(new EnvironmentCallbackAnnotation((EnvironmentCallbackContext context) =>
{
Expand Down
2 changes: 1 addition & 1 deletion src/Aspire.Hosting.MongoDB/MongoDBBuilderExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ public static IResourceBuilder<T> WithMongoExpress<T>(this IResourceBuilder<T> b
.WithImageRegistry(MongoDBContainerImageTags.MongoExpressRegistry)
.WithEnvironment(context => ConfigureMongoExpressContainer(context, builder.Resource))
.WithHttpEndpoint(targetPort: 8081, name: "http")
.WithParentRelationship(builder.Resource)
.WithParentRelationship(builder)
.ExcludeFromManifest();

configureContainer?.Invoke(resourceBuilder);
Expand Down
30 changes: 30 additions & 0 deletions src/Aspire.Hosting/ResourceBuilderExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1138,6 +1138,36 @@ public static IResourceBuilder<T> WithRelationship<T>(
return builder.WithAnnotation(new ResourceRelationshipAnnotation(resource, type));
}

/// <summary>
/// Adds a <see cref="ResourceRelationshipAnnotation"/> to the resource annotations to add a parent-child relationship.
/// </summary>
/// <typeparam name="T">The type of the resource.</typeparam>
/// <param name="builder">The resource builder.</param>
/// <param name="parent">The parent of <paramref name="builder"/>.</param>
/// <returns>A resource builder.</returns>
/// <remarks>
/// <para>
/// The <c>WithParentRelationship</c> method is used to add parent relationships to the resource. Relationships are used to link
/// resources together in UI.
/// </para>
/// </remarks>
/// <example>
/// This example shows adding a relationship between two resources.
/// <code lang="C#">
/// var builder = DistributedApplication.CreateBuilder(args);
/// var backend = builder.AddProject&lt;Projects.Backend&gt;("backend");
///
/// var frontend = builder.AddProject&lt;Projects.Manager&gt;("frontend")
/// .WithParentRelationship(backend);
/// </code>
/// </example>
public static IResourceBuilder<T> WithParentRelationship<T>(
this IResourceBuilder<T> builder,
IResourceBuilder<IResource> parent) where T : IResource
{
return builder.WithParentRelationship(parent.Resource);
}

/// <summary>
/// Adds a <see cref="ResourceRelationshipAnnotation"/> to the resource annotations to add a parent-child relationship.
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,10 +68,10 @@ public async Task WithParentRelationshipSetsParentPropertyCorrectly()
var builder = DistributedApplication.CreateBuilder();

var parent = builder.AddContainer("parent", "image");
var child = builder.AddContainer("child", "image").WithParentRelationship(parent.Resource);
var child2 = builder.AddContainer("child2", "image").WithParentRelationship(parent.Resource);
var child = builder.AddContainer("child", "image").WithParentRelationship(parent);
var child2 = builder.AddContainer("child2", "image").WithParentRelationship(parent);

var nestedChild = builder.AddContainer("nested-child", "image").WithParentRelationship(child.Resource);
var nestedChild = builder.AddContainer("nested-child", "image").WithParentRelationship(child);

using var app = builder.Build();
var distributedAppModel = app.Services.GetRequiredService<DistributedApplicationModel>();
Expand Down Expand Up @@ -137,8 +137,8 @@ public async Task LastWithParentRelationshipWins()

var child = builder.AddContainer("child", "image");

child.WithParentRelationship(firstParent.Resource);
child.WithParentRelationship(secondParent.Resource);
child.WithParentRelationship(firstParent);
child.WithParentRelationship(secondParent);

using var app = builder.Build();
var distributedAppModel = app.Services.GetRequiredService<DistributedApplicationModel>();
Expand Down Expand Up @@ -191,7 +191,7 @@ public async Task WithParentRelationshipWorksWithProjects()
var builder = DistributedApplication.CreateBuilder();

var projectA = builder.AddProject<ProjectA>("projecta");
var projectB = builder.AddProject<ProjectB>("projectb").WithParentRelationship(projectA.Resource);
var projectB = builder.AddProject<ProjectB>("projectb").WithParentRelationship(projectA);

using var app = builder.Build();
var distributedAppModel = app.Services.GetRequiredService<DistributedApplicationModel>();
Expand Down Expand Up @@ -241,9 +241,9 @@ public void DetectsCircularDependency()
var container2 = builder.AddContainer("container2", "image2");
var container3 = builder.AddContainer("container3", "image3");

container1.WithParentRelationship(container2.Resource);
container2.WithParentRelationship(container3.Resource);
container3.WithParentRelationship(container1.Resource);
container1.WithParentRelationship(container2);
container2.WithParentRelationship(container3);
container3.WithParentRelationship(container1);

using var app = builder.Build();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@ public void HandlesNestedChildren()
var greatGrandChildResource = builder.AddResource(new CustomChildResource("greatgrandchild", grandChildResource.Resource));

var childWithAnnotationsResource = builder.AddContainer("child-with-annotations", "image")
.WithParentRelationship(parentResource.Resource);
.WithParentRelationship(parentResource);

var grandChildWithAnnotationsResource = builder.AddContainer("grandchild-with-annotations", "image")
.WithParentRelationship(childWithAnnotationsResource.Resource);
.WithParentRelationship(childWithAnnotationsResource);

using var app = builder.Build();
var appModel = app.Services.GetRequiredService<DistributedApplicationModel>();
Expand Down