Conversation
…ogic Aspire 13.2.0 introduces internal rebuilder resources for .NET Project resources that appear in DistributedApplicationModel.Resources but never transition to Running/Healthy. This caused AllHealthy/AllRunning wait modes to hang until timeout. Filter out IResourceWithoutLifetime resources (data-holder/reference resources with no lifecycle) when collecting resources to wait for. Fixes #5260
Code ReviewThis is a clean, well-scoped fix for the Aspire 13.2.0 regression. Here's my analysis: What's goodCorrect interface check. Filtering on Lazy allocation is consistent with TUnit's performance-first principles. Using
Early return in Logging skipped resources provides the right amount of visibility — future readers won't wonder why rebuilder resources disappeared from the wait log. One minor observationIn var resourceNames = string.Join(", ", model.Resources.Select(r => $"'{r.Name}'"));This is the catch block for custom var waitableNames = GetWaitableResourceNames(model);
var resourceNames = string.Join(", ", waitableNames.Select(n => $"'{n}'"));This is a nice-to-have, not a blocker — the fallback path is only reached when overriding OverallThe root cause fix is correct, the implementation is clean, and the change is minimal. The lazy-init pattern and correct exclusion of |
Summary
{name}-rebuilderresources for .NET Project resources that appear inDistributedApplicationModel.Resourcesbut never transition to Running/HealthyAllHealthy/AllRunningwait modes now filter outIResourceWithoutLifetimeresources (data-holder/reference resources with no lifecycle) before waiting, preventing indefinite hangsLogProgressfor visibilityFixes #5260
Test plan
TUnit.Aspirebuilds on all target frameworks (net8.0, net9.0, net10.0)AllHealthymode no longer hangs on rebuilder resourcesAllRunningmode no longer hangs on rebuilder resourcesNamedmode is unaffected (does not use the new filter)