diff --git a/src/Aspire.Hosting/ContainerResourceBuilderExtensions.cs b/src/Aspire.Hosting/ContainerResourceBuilderExtensions.cs
index 041dac2ba5e..10e6d026321 100644
--- a/src/Aspire.Hosting/ContainerResourceBuilderExtensions.cs
+++ b/src/Aspire.Hosting/ContainerResourceBuilderExtensions.cs
@@ -20,6 +20,10 @@ public static class ContainerResourceBuilderExtensions
/// The for chaining.
public static IResourceBuilder AddContainer(this IDistributedApplicationBuilder builder, [ResourceName] string name, string image)
{
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(name);
+ ArgumentNullException.ThrowIfNull(image);
+
return builder.AddContainer(name, image, "latest");
}
@@ -33,6 +37,11 @@ public static IResourceBuilder AddContainer(this IDistributed
/// The for chaining.
public static IResourceBuilder AddContainer(this IDistributedApplicationBuilder builder, [ResourceName] string name, string image, string tag)
{
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(name);
+ ArgumentNullException.ThrowIfNull(image);
+ ArgumentNullException.ThrowIfNull(tag);
+
var container = new ContainerResource(name);
return builder.AddResource(container)
.WithImage(image, tag);
@@ -47,8 +56,11 @@ public static IResourceBuilder AddContainer(this IDistributed
/// The target path where the volume is mounted in the container.
/// A flag that indicates if the volume should be mounted as read-only.
/// The .
- public static IResourceBuilder WithVolume(this IResourceBuilder builder, string name, string target, bool isReadOnly = false) where T : ContainerResource
+ public static IResourceBuilder WithVolume(this IResourceBuilder builder, string? name, string target, bool isReadOnly = false) where T : ContainerResource
{
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(target);
+
var annotation = new ContainerMountAnnotation(name, target, ContainerMountType.Volume, isReadOnly);
return builder.WithAnnotation(annotation);
}
@@ -62,6 +74,9 @@ public static IResourceBuilder WithVolume(this IResourceBuilder builder
/// The .
public static IResourceBuilder WithVolume(this IResourceBuilder builder, string target) where T : ContainerResource
{
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(target);
+
var annotation = new ContainerMountAnnotation(null, target, ContainerMountType.Volume, false);
return builder.WithAnnotation(annotation);
}
@@ -77,6 +92,10 @@ public static IResourceBuilder WithVolume(this IResourceBuilder builder
/// The .
public static IResourceBuilder WithBindMount(this IResourceBuilder builder, string source, string target, bool isReadOnly = false) where T : ContainerResource
{
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(source);
+ ArgumentNullException.ThrowIfNull(target);
+
var annotation = new ContainerMountAnnotation(Path.GetFullPath(source, builder.ApplicationBuilder.AppHostDirectory), target, ContainerMountType.BindMount, isReadOnly);
return builder.WithAnnotation(annotation);
}
@@ -90,6 +109,9 @@ public static IResourceBuilder WithBindMount(this IResourceBuilder buil
/// The .
public static IResourceBuilder WithEntrypoint(this IResourceBuilder builder, string entrypoint) where T : ContainerResource
{
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(entrypoint);
+
builder.Resource.Entrypoint = entrypoint;
return builder;
}
@@ -103,6 +125,9 @@ public static IResourceBuilder WithEntrypoint(this IResourceBuilder bui
///
public static IResourceBuilder WithImageTag(this IResourceBuilder builder, string tag) where T : ContainerResource
{
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(tag);
+
if (builder.Resource.Annotations.OfType().LastOrDefault() is { } existingImageAnnotation)
{
existingImageAnnotation.Tag = tag;
@@ -119,8 +144,10 @@ public static IResourceBuilder WithImageTag(this IResourceBuilder build
/// Builder for the container resource.
/// Registry value.
///
- public static IResourceBuilder WithImageRegistry(this IResourceBuilder builder, string registry) where T : ContainerResource
+ public static IResourceBuilder WithImageRegistry(this IResourceBuilder builder, string? registry) where T : ContainerResource
{
+ ArgumentNullException.ThrowIfNull(builder);
+
if (builder.Resource.Annotations.OfType().LastOrDefault() is { } existingImageAnnotation)
{
existingImageAnnotation.Registry = registry;
@@ -140,6 +167,10 @@ public static IResourceBuilder WithImageRegistry(this IResourceBuilder
///
public static IResourceBuilder WithImage(this IResourceBuilder builder, string image, string tag = "latest") where T : ContainerResource
{
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(image);
+ ArgumentNullException.ThrowIfNull(tag);
+
if (builder.Resource.Annotations.OfType().LastOrDefault() is { } existingImageAnnotation)
{
existingImageAnnotation.Image = image;
@@ -162,6 +193,9 @@ public static IResourceBuilder WithImage(this IResourceBuilder builder,
///
public static IResourceBuilder WithImageSHA256(this IResourceBuilder builder, string sha256) where T : ContainerResource
{
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(sha256);
+
if (builder.Resource.Annotations.OfType().LastOrDefault() is { } existingImageAnnotation)
{
existingImageAnnotation.SHA256 = sha256;
@@ -183,6 +217,8 @@ public static IResourceBuilder WithImageSHA256(this IResourceBuilder bu
/// The .
public static IResourceBuilder WithContainerRuntimeArgs(this IResourceBuilder builder, params string[] args) where T : ContainerResource
{
+ ArgumentNullException.ThrowIfNull(builder);
+
return builder.WithContainerRuntimeArgs(context => context.Args.AddRange(args));
}
@@ -198,6 +234,9 @@ public static IResourceBuilder WithContainerRuntimeArgs(this IResourceBuil
/// The .
public static IResourceBuilder WithContainerRuntimeArgs(this IResourceBuilder builder, Action callback) where T : ContainerResource
{
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(callback);
+
return builder.WithContainerRuntimeArgs(context =>
{
callback(context);
@@ -217,6 +256,9 @@ public static IResourceBuilder WithContainerRuntimeArgs(this IResourceBuil
/// The .
public static IResourceBuilder WithContainerRuntimeArgs(this IResourceBuilder builder, Func callback) where T : ContainerResource
{
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(callback);
+
var annotation = new ContainerRuntimeArgsCallbackAnnotation(callback);
return builder.WithAnnotation(annotation);
}
@@ -238,6 +280,8 @@ public static IResourceBuilder WithContainerRuntimeArgs(this IResourceBuil
///
public static IResourceBuilder WithLifetime(this IResourceBuilder builder, ContainerLifetime lifetime) where T : ContainerResource
{
+ ArgumentNullException.ThrowIfNull(builder);
+
return builder.WithAnnotation(new ContainerLifetimeAnnotation { Lifetime = lifetime }, ResourceAnnotationMutationBehavior.Replace);
}
@@ -253,6 +297,8 @@ private static IResourceBuilder ThrowResourceIsNotContainer(IResourceBuild
/// A reference to the .
public static IResourceBuilder PublishAsContainer(this IResourceBuilder builder) where T : ContainerResource
{
+ ArgumentNullException.ThrowIfNull(builder);
+
return builder.WithManifestPublishingCallback(context => context.WriteContainerAsync(builder.Resource));
}
@@ -293,6 +339,7 @@ public static IResourceBuilder PublishAsContainer(this IResourceBuilder
///
public static IResourceBuilder WithDockerfile(this IResourceBuilder builder, string contextPath, string? dockerfilePath = null, string? stage = null) where T : ContainerResource
{
+ ArgumentNullException.ThrowIfNull(builder);
ArgumentException.ThrowIfNullOrEmpty(contextPath);
var fullyQualifiedContextPath = Path.GetFullPath(contextPath, builder.ApplicationBuilder.AppHostDirectory);
@@ -314,7 +361,7 @@ public static IResourceBuilder WithDockerfile(this IResourceBuilder bui
var imageName = builder.GenerateImageName();
var annotation = new DockerfileBuildAnnotation(fullyQualifiedContextPath, fullyQualifiedDockerfilePath, stage);
return builder.WithAnnotation(annotation, ResourceAnnotationMutationBehavior.Replace)
- .WithImageRegistry(null!)
+ .WithImageRegistry(registry: null)
.WithImage(imageName)
.WithImageTag("latest");
}
@@ -350,6 +397,10 @@ public static IResourceBuilder WithDockerfile(this IResourceBuilder bui
///
public static IResourceBuilder AddDockerfile(this IDistributedApplicationBuilder builder, [ResourceName] string name, string contextPath, string? dockerfilePath = null, string? stage = null)
{
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(name);
+ ArgumentNullException.ThrowIfNull(contextPath);
+
return builder.AddContainer(name, "placeholder") // Image name will be replaced by WithDockerfile.
.WithDockerfile(contextPath, dockerfilePath, stage);
}
@@ -369,6 +420,9 @@ public static IResourceBuilder AddDockerfile(this IDistribute
/// The resource bulder for the container resource.
public static IResourceBuilder WithContainerName(this IResourceBuilder builder, string name) where T : ContainerResource
{
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(name);
+
return builder.WithAnnotation(new ContainerNameAnnotation { Name = name }, ResourceAnnotationMutationBehavior.Replace);
}
@@ -402,6 +456,7 @@ public static IResourceBuilder WithContainerName(this IResourceBuilder
///
public static IResourceBuilder WithBuildArg(this IResourceBuilder builder, string name, object value) where T : ContainerResource
{
+ ArgumentNullException.ThrowIfNull(builder);
ArgumentException.ThrowIfNullOrEmpty(name);
ArgumentNullException.ThrowIfNull(value);
@@ -448,6 +503,10 @@ public static IResourceBuilder WithBuildArg(this IResourceBuilder build
///
public static IResourceBuilder WithBuildArg(this IResourceBuilder builder, string name, IResourceBuilder value) where T : ContainerResource
{
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(name);
+ ArgumentNullException.ThrowIfNull(value);
+
if (value.Resource.Secret)
{
throw new InvalidOperationException("Cannot add secret parameter as a build argument. Use WithSecretBuildArg instead.");
@@ -487,6 +546,7 @@ public static IResourceBuilder WithBuildArg(this IResourceBuilder build
///
public static IResourceBuilder WithBuildSecret(this IResourceBuilder builder, string name, IResourceBuilder value) where T : ContainerResource
{
+ ArgumentNullException.ThrowIfNull(builder);
ArgumentException.ThrowIfNullOrEmpty(name);
ArgumentNullException.ThrowIfNull(value);
diff --git a/src/Aspire.Hosting/ContainerResourceExtensions.cs b/src/Aspire.Hosting/ContainerResourceExtensions.cs
index 5c520aea8be..ea48e0b5575 100644
--- a/src/Aspire.Hosting/ContainerResourceExtensions.cs
+++ b/src/Aspire.Hosting/ContainerResourceExtensions.cs
@@ -17,6 +17,8 @@ public static class ContainerResourceExtensions
/// A collection of container resources in the specified distributed application model.
public static IEnumerable GetContainerResources(this DistributedApplicationModel model)
{
+ ArgumentNullException.ThrowIfNull(model);
+
foreach (var resource in model.Resources)
{
if (resource.Annotations.OfType().Any())
@@ -33,6 +35,8 @@ public static IEnumerable GetContainerResources(this DistributedAppli
/// true if the specified resource is a container resource; otherwise, false.
public static bool IsContainer(this IResource resource)
{
+ ArgumentNullException.ThrowIfNull(resource);
+
return resource.Annotations.OfType().Any();
}
}
diff --git a/src/Aspire.Hosting/ExecutableResourceBuilderExtensions.cs b/src/Aspire.Hosting/ExecutableResourceBuilderExtensions.cs
index dc402967b10..8c16df8404f 100644
--- a/src/Aspire.Hosting/ExecutableResourceBuilderExtensions.cs
+++ b/src/Aspire.Hosting/ExecutableResourceBuilderExtensions.cs
@@ -23,6 +23,11 @@ public static class ExecutableResourceBuilderExtensions
/// The .
public static IResourceBuilder AddExecutable(this IDistributedApplicationBuilder builder, [ResourceName] string name, string command, string workingDirectory, params string[]? args)
{
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(name);
+ ArgumentNullException.ThrowIfNull(command);
+ ArgumentNullException.ThrowIfNull(workingDirectory);
+
return AddExecutable(builder, name, command, workingDirectory, (object[]?)args);
}
@@ -37,6 +42,11 @@ public static IResourceBuilder AddExecutable(this IDistribut
/// The .
public static IResourceBuilder AddExecutable(this IDistributedApplicationBuilder builder, [ResourceName] string name, string command, string workingDirectory, params object[]? args)
{
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(name);
+ ArgumentNullException.ThrowIfNull(command);
+ ArgumentNullException.ThrowIfNull(workingDirectory);
+
workingDirectory = PathNormalizer.NormalizePathForCurrentPlatform(Path.Combine(builder.AppHostDirectory, workingDirectory));
var executable = new ExecutableResource(name, command, workingDirectory);
@@ -61,6 +71,8 @@ public static IResourceBuilder AddExecutable(this IDistribut
/// A reference to the .
public static IResourceBuilder PublishAsDockerFile(this IResourceBuilder builder, IEnumerable? buildArgs = null) where T : ExecutableResource
{
+ ArgumentNullException.ThrowIfNull(builder);
+
return builder.WithManifestPublishingCallback(context => WriteExecutableAsDockerfileResourceAsync(context, builder.Resource, buildArgs));
}
diff --git a/src/Aspire.Hosting/ExecutableResourceExtensions.cs b/src/Aspire.Hosting/ExecutableResourceExtensions.cs
index 5b7604a1ad6..69fccd1f39a 100644
--- a/src/Aspire.Hosting/ExecutableResourceExtensions.cs
+++ b/src/Aspire.Hosting/ExecutableResourceExtensions.cs
@@ -17,6 +17,8 @@ public static class ExecutableResourceExtensions
/// An enumerable collection of executable resources.
public static IEnumerable GetExecutableResources(this DistributedApplicationModel model)
{
+ ArgumentNullException.ThrowIfNull(model);
+
return model.Resources.OfType();
}
}
diff --git a/src/Aspire.Hosting/OtlpConfigurationExtensions.cs b/src/Aspire.Hosting/OtlpConfigurationExtensions.cs
index e08c74f94a4..ffed6b77be1 100644
--- a/src/Aspire.Hosting/OtlpConfigurationExtensions.cs
+++ b/src/Aspire.Hosting/OtlpConfigurationExtensions.cs
@@ -27,6 +27,10 @@ public static class OtlpConfigurationExtensions
/// The host environment to check if the application is running in development mode.
public static void AddOtlpEnvironment(IResource resource, IConfiguration configuration, IHostEnvironment environment)
{
+ ArgumentNullException.ThrowIfNull(resource);
+ ArgumentNullException.ThrowIfNull(configuration);
+ ArgumentNullException.ThrowIfNull(environment);
+
// Configure OpenTelemetry in projects using environment variables.
// https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/configuration/sdk-environment-variables.md
@@ -112,6 +116,8 @@ static void SetOtelEndpointAndProtocol(Dictionary environmentVar
/// The .
public static IResourceBuilder WithOtlpExporter(this IResourceBuilder builder) where T : IResourceWithEnvironment
{
+ ArgumentNullException.ThrowIfNull(builder);
+
AddOtlpEnvironment(builder.Resource, builder.ApplicationBuilder.Configuration, builder.ApplicationBuilder.Environment);
return builder;
}
diff --git a/src/Aspire.Hosting/ParameterResourceBuilderExtensions.cs b/src/Aspire.Hosting/ParameterResourceBuilderExtensions.cs
index ebd8006409f..04473465aae 100644
--- a/src/Aspire.Hosting/ParameterResourceBuilderExtensions.cs
+++ b/src/Aspire.Hosting/ParameterResourceBuilderExtensions.cs
@@ -24,6 +24,9 @@ public static class ParameterResourceBuilderExtensions
///
public static IResourceBuilder AddParameter(this IDistributedApplicationBuilder builder, [ResourceName] string name, bool secret = false)
{
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(name);
+
return builder.AddParameter(name, parameterDefault => GetParameterValue(builder.Configuration, name, parameterDefault), secret: secret);
}
@@ -41,6 +44,10 @@ public static IResourceBuilder AddParameter(this IDistributed
Justification = "third parameters are mutually exclusive.")]
public static IResourceBuilder AddParameter(this IDistributedApplicationBuilder builder, [ResourceName] string name, string value, bool publishValueAsDefault = false, bool secret = false)
{
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(name);
+ ArgumentNullException.ThrowIfNull(value);
+
return builder.AddParameter(name, () => value, publishValueAsDefault, secret);
}
@@ -58,6 +65,10 @@ public static IResourceBuilder AddParameter(this IDistributed
Justification = "third parameters are mutually exclusive.")]
public static IResourceBuilder AddParameter(this IDistributedApplicationBuilder builder, string name, Func valueGetter, bool publishValueAsDefault = false, bool secret = false)
{
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(name);
+ ArgumentNullException.ThrowIfNull(valueGetter);
+
// We don't allow a parameter to be both secret and published, as that would write the secret to the manifest.
if (publishValueAsDefault && secret)
{
@@ -83,6 +94,10 @@ public static IResourceBuilder AddParameter(this IDistributed
/// Resource builder for the parameter.
public static IResourceBuilder AddParameterFromConfiguration(this IDistributedApplicationBuilder builder, string name, string configurationKey, bool secret = false)
{
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(name);
+ ArgumentNullException.ThrowIfNull(configurationKey);
+
return builder.AddParameter(
name,
parameterDefault => GetParameterValue(builder.Configuration, name, parameterDefault, configurationKey),
@@ -106,6 +121,10 @@ public static IResourceBuilder AddParameterFromConfiguration(
Justification = "third parameters are mutually exclusive.")]
public static IResourceBuilder AddParameter(this IDistributedApplicationBuilder builder, [ResourceName] string name, ParameterDefault value, bool secret = false, bool persist = false)
{
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(name);
+ ArgumentNullException.ThrowIfNull(value);
+
// If it needs persistence, wrap it in a UserSecretsParameterDefault
if (persist && builder.ExecutionContext.IsRunMode && builder.AppHostAssembly is not null)
{
@@ -197,6 +216,9 @@ public Task BeforeStartAsync(DistributedApplicationModel appModel, CancellationT
///
public static IResourceBuilder AddConnectionString(this IDistributedApplicationBuilder builder, [ResourceName] string name, string? environmentVariableName = null)
{
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(name);
+
var parameterBuilder = builder.AddParameter(name, _ =>
{
return builder.Configuration.GetConnectionString(name) ?? throw new DistributedApplicationException($"Connection string parameter resource could not be used because connection string '{name}' is missing.");
@@ -217,6 +239,8 @@ public static IResourceBuilder AddConnectionStrin
public static IResourceBuilder PublishAsConnectionString(this IResourceBuilder builder)
where T : ContainerResource, IResourceWithConnectionString
{
+ ArgumentNullException.ThrowIfNull(builder);
+
ConfigureConnectionStringManifestPublisher(builder);
return builder;
}
@@ -227,6 +251,8 @@ public static IResourceBuilder PublishAsConnectionString(this IResourceBui
/// The .
public static void ConfigureConnectionStringManifestPublisher(IResourceBuilder builder)
{
+ ArgumentNullException.ThrowIfNull(builder);
+
// Create a parameter resource that we use to write to the manifest
var parameter = new ParameterResource(builder.Resource.Name, _ => "", secret: true);
parameter.IsConnectionString = true;
@@ -257,6 +283,9 @@ public static ParameterResource CreateDefaultPasswordParameter(
bool lower = true, bool upper = true, bool numeric = true, bool special = true,
int minLower = 0, int minUpper = 0, int minNumeric = 0, int minSpecial = 0)
{
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(name);
+
var generatedPassword = new GenerateParameterDefault
{
MinLength = 22, // enough to give 128 bits of entropy when using the default 67 possible characters. See remarks in GenerateParameterDefault
@@ -287,6 +316,9 @@ public static ParameterResource CreateDefaultPasswordParameter(
public static ParameterResource CreateGeneratedParameter(
IDistributedApplicationBuilder builder, string name, bool secret, GenerateParameterDefault parameterDefault)
{
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(name);
+
var parameterResource = new ParameterResource(name, defaultValue => GetParameterValue(builder.Configuration, name, defaultValue), secret)
{
Default = parameterDefault
diff --git a/src/Aspire.Hosting/ProjectResourceBuilderExtensions.cs b/src/Aspire.Hosting/ProjectResourceBuilderExtensions.cs
index be0b4aeb4ec..e63b78081a1 100644
--- a/src/Aspire.Hosting/ProjectResourceBuilderExtensions.cs
+++ b/src/Aspire.Hosting/ProjectResourceBuilderExtensions.cs
@@ -60,6 +60,9 @@ public static class ProjectResourceBuilderExtensions
///
public static IResourceBuilder AddProject(this IDistributedApplicationBuilder builder, [ResourceName] string name) where TProject : IProjectMetadata, new()
{
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(name);
+
return builder.AddProject(name, _ => { });
}
@@ -90,6 +93,10 @@ public static class ProjectResourceBuilderExtensions
///
public static IResourceBuilder AddProject(this IDistributedApplicationBuilder builder, [ResourceName] string name, string projectPath)
{
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(name);
+ ArgumentNullException.ThrowIfNull(projectPath);
+
return builder.AddProject(name, projectPath, _ => { });
}
@@ -133,6 +140,9 @@ public static IResourceBuilder AddProject(this IDistributedAppl
///
public static IResourceBuilder AddProject(this IDistributedApplicationBuilder builder, [ResourceName] string name, string? launchProfileName) where TProject : IProjectMetadata, new()
{
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(name);
+
return builder.AddProject(name, options =>
{
options.ExcludeLaunchProfile = launchProfileName is null;
@@ -168,6 +178,10 @@ public static IResourceBuilder AddProject(this IDistributedAppl
///
public static IResourceBuilder AddProject(this IDistributedApplicationBuilder builder, [ResourceName] string name, string projectPath, string? launchProfileName)
{
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(name);
+ ArgumentNullException.ThrowIfNull(projectPath);
+
return builder.AddProject(name, projectPath, options =>
{
options.ExcludeLaunchProfile = launchProfileName is null;
@@ -213,6 +227,10 @@ public static IResourceBuilder AddProject(this IDistributedAppl
///
public static IResourceBuilder AddProject(this IDistributedApplicationBuilder builder, [ResourceName] string name, Action configure) where TProject : IProjectMetadata, new()
{
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(name);
+ ArgumentNullException.ThrowIfNull(configure);
+
var options = new ProjectResourceOptions();
configure(options);
@@ -249,6 +267,11 @@ public static IResourceBuilder AddProject(this IDistributedAppl
///
public static IResourceBuilder AddProject(this IDistributedApplicationBuilder builder, [ResourceName] string name, string projectPath, Action configure)
{
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(name);
+ ArgumentNullException.ThrowIfNull(projectPath);
+ ArgumentNullException.ThrowIfNull(configure);
+
var options = new ProjectResourceOptions();
configure(options);
@@ -539,6 +562,8 @@ EndpointAnnotation GetOrCreateEndpointForScheme(string scheme)
///
public static IResourceBuilder WithReplicas(this IResourceBuilder builder, int replicas)
{
+ ArgumentNullException.ThrowIfNull(builder);
+
builder.WithAnnotation(new ReplicaAnnotation(replicas));
return builder;
}
@@ -571,6 +596,8 @@ public static IResourceBuilder WithReplicas(this IResourceBuild
///
public static IResourceBuilder DisableForwardedHeaders(this IResourceBuilder builder)
{
+ ArgumentNullException.ThrowIfNull(builder);
+
builder.WithAnnotation(ResourceAnnotationMutationBehavior.Replace);
return builder;
}
@@ -585,6 +612,9 @@ public static IResourceBuilder DisableForwardedHeaders(this IRe
public static IResourceBuilder WithEndpointsInEnvironment(
this IResourceBuilder builder, Func filter)
{
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(filter);
+
builder.Resource.Annotations.Add(new EndpointEnvironmentInjectionFilterAnnotation(filter));
return builder;
diff --git a/src/Aspire.Hosting/PublicAPI.Shipped.txt b/src/Aspire.Hosting/PublicAPI.Shipped.txt
index dcd312f1fad..993f54cb560 100644
--- a/src/Aspire.Hosting/PublicAPI.Shipped.txt
+++ b/src/Aspire.Hosting/PublicAPI.Shipped.txt
@@ -438,10 +438,8 @@ static Aspire.Hosting.ContainerResourceBuilderExtensions.WithContainerRuntimeArg
static Aspire.Hosting.ContainerResourceBuilderExtensions.WithContainerRuntimeArgs(this Aspire.Hosting.ApplicationModel.IResourceBuilder! builder, System.Func! callback) -> Aspire.Hosting.ApplicationModel.IResourceBuilder!
static Aspire.Hosting.ContainerResourceBuilderExtensions.WithEntrypoint(this Aspire.Hosting.ApplicationModel.IResourceBuilder! builder, string! entrypoint) -> Aspire.Hosting.ApplicationModel.IResourceBuilder!
static Aspire.Hosting.ContainerResourceBuilderExtensions.WithImage(this Aspire.Hosting.ApplicationModel.IResourceBuilder! builder, string! image, string! tag = "latest") -> Aspire.Hosting.ApplicationModel.IResourceBuilder!
-static Aspire.Hosting.ContainerResourceBuilderExtensions.WithImageRegistry(this Aspire.Hosting.ApplicationModel.IResourceBuilder! builder, string! registry) -> Aspire.Hosting.ApplicationModel.IResourceBuilder!
static Aspire.Hosting.ContainerResourceBuilderExtensions.WithImageSHA256(this Aspire.Hosting.ApplicationModel.IResourceBuilder! builder, string! sha256) -> Aspire.Hosting.ApplicationModel.IResourceBuilder!
static Aspire.Hosting.ContainerResourceBuilderExtensions.WithImageTag(this Aspire.Hosting.ApplicationModel.IResourceBuilder! builder, string! tag) -> Aspire.Hosting.ApplicationModel.IResourceBuilder!
-static Aspire.Hosting.ContainerResourceBuilderExtensions.WithVolume(this Aspire.Hosting.ApplicationModel.IResourceBuilder! builder, string! name, string! target, bool isReadOnly = false) -> Aspire.Hosting.ApplicationModel.IResourceBuilder!
static Aspire.Hosting.ContainerResourceBuilderExtensions.WithVolume(this Aspire.Hosting.ApplicationModel.IResourceBuilder! builder, string! target) -> Aspire.Hosting.ApplicationModel.IResourceBuilder!
static Aspire.Hosting.ContainerResourceExtensions.GetContainerResources(this Aspire.Hosting.ApplicationModel.DistributedApplicationModel! model) -> System.Collections.Generic.IEnumerable!
static Aspire.Hosting.ContainerResourceExtensions.IsContainer(this Aspire.Hosting.ApplicationModel.IResource! resource) -> bool
diff --git a/src/Aspire.Hosting/PublicAPI.Unshipped.txt b/src/Aspire.Hosting/PublicAPI.Unshipped.txt
index 0c67fb7aaf8..1207d8eeae0 100644
--- a/src/Aspire.Hosting/PublicAPI.Unshipped.txt
+++ b/src/Aspire.Hosting/PublicAPI.Unshipped.txt
@@ -217,7 +217,9 @@ Aspire.Hosting.ApplicationModel.ResourceNotificationService.WaitForResourceAsync
Aspire.Hosting.ApplicationModel.ResourceNotificationService.WaitForResourceAsync(string! resourceName, System.Collections.Generic.IEnumerable! targetStates, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
static Aspire.Hosting.ApplicationModel.ResourceExtensions.TryGetAnnotationsIncludingAncestorsOfType(this Aspire.Hosting.ApplicationModel.IResource! resource, out System.Collections.Generic.IEnumerable? result) -> bool
static Aspire.Hosting.ContainerResourceBuilderExtensions.WithContainerName(this Aspire.Hosting.ApplicationModel.IResourceBuilder! builder, string! name) -> Aspire.Hosting.ApplicationModel.IResourceBuilder!
+static Aspire.Hosting.ContainerResourceBuilderExtensions.WithImageRegistry(this Aspire.Hosting.ApplicationModel.IResourceBuilder! builder, string? registry) -> Aspire.Hosting.ApplicationModel.IResourceBuilder!
static Aspire.Hosting.ContainerResourceBuilderExtensions.WithLifetime(this Aspire.Hosting.ApplicationModel.IResourceBuilder! builder, Aspire.Hosting.ApplicationModel.ContainerLifetime lifetime) -> Aspire.Hosting.ApplicationModel.IResourceBuilder!
+static Aspire.Hosting.ContainerResourceBuilderExtensions.WithVolume(this Aspire.Hosting.ApplicationModel.IResourceBuilder! builder, string? name, string! target, bool isReadOnly = false) -> Aspire.Hosting.ApplicationModel.IResourceBuilder!
static Aspire.Hosting.ParameterResourceBuilderExtensions.AddParameter(this Aspire.Hosting.IDistributedApplicationBuilder! builder, string! name, Aspire.Hosting.ApplicationModel.ParameterDefault! value, bool secret = false, bool persist = false) -> Aspire.Hosting.ApplicationModel.IResourceBuilder!
static Aspire.Hosting.ParameterResourceBuilderExtensions.AddParameter(this Aspire.Hosting.IDistributedApplicationBuilder! builder, string! name, string! value, bool publishValueAsDefault = false, bool secret = false) -> Aspire.Hosting.ApplicationModel.IResourceBuilder!
static Aspire.Hosting.ParameterResourceBuilderExtensions.AddParameter(this Aspire.Hosting.IDistributedApplicationBuilder! builder, string! name, System.Func! valueGetter, bool publishValueAsDefault = false, bool secret = false) -> Aspire.Hosting.ApplicationModel.IResourceBuilder!
diff --git a/src/Aspire.Hosting/ResourceBuilderExtensions.cs b/src/Aspire.Hosting/ResourceBuilderExtensions.cs
index c2457cbae19..4c6e44572fb 100644
--- a/src/Aspire.Hosting/ResourceBuilderExtensions.cs
+++ b/src/Aspire.Hosting/ResourceBuilderExtensions.cs
@@ -28,6 +28,9 @@ public static class ResourceBuilderExtensions
/// A resource configured with the specified environment variable.
public static IResourceBuilder WithEnvironment(this IResourceBuilder builder, string name, string? value) where T : IResourceWithEnvironment
{
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(name);
+
return builder.WithAnnotation(new EnvironmentAnnotation(name, value ?? string.Empty));
}
@@ -42,6 +45,9 @@ public static IResourceBuilder WithEnvironment(this IResourceBuilder bu
public static IResourceBuilder WithEnvironment(this IResourceBuilder builder, string name, in ReferenceExpression.ExpressionInterpolatedStringHandler value)
where T : IResourceWithEnvironment
{
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(name);
+
var expression = value.GetExpression();
return builder.WithEnvironment(context =>
@@ -61,6 +67,10 @@ public static IResourceBuilder WithEnvironment(this IResourceBuilder bu
public static IResourceBuilder WithEnvironment(this IResourceBuilder builder, string name, ReferenceExpression value)
where T : IResourceWithEnvironment
{
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(name);
+ ArgumentNullException.ThrowIfNull(value);
+
return builder.WithEnvironment(context =>
{
context.EnvironmentVariables[name] = value;
@@ -77,6 +87,10 @@ public static IResourceBuilder WithEnvironment(this IResourceBuilder bu
/// A resource configured with the specified environment variable.
public static IResourceBuilder WithEnvironment(this IResourceBuilder builder, string name, Func