File: BicepResourceAnnotation.cs
Web Access
Project: src\src\Aspire.Hosting.Azure\Aspire.Hosting.Azure.csproj (Aspire.Hosting.Azure)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Aspire.Hosting.ApplicationModel;
 
namespace Aspire.Hosting.Azure;
 
/// <summary>
/// Used to annotate resources as being potentially deployable by the <see cref="AzureProvisioner"/>.
/// </summary>
/// <param name="resource">The <see cref="AzureBicepResource"/> which should be used by the <see cref="AzureProvisioner"/>.</param>
/// <remarks>
///     <para>
///         The <see cref="AzureProvisioner"/> is only capable of deploying resources that implement <see cref="IAzureResource"/>
///         and only has built-in deployment logic for resources that derive from <see cref="AzureBicepResource"/>. This annotation
///         that can be added to any <see cref="IResource"/> will be detected by the <see cref="AzureProvisioner"/> and used to
///         provision an Azure resource for an Aspire resource type that does not itself derive from <see cref="AzureBicepResource"/>.
///     </para>
///     <para>
///         For example, the following code adds a <see href="https://learn.microsoft.com/dotnet/api/aspire.hosting.applicationmodel.sqlserverserverresource"/>
///         resource to the application model. This type does not derive from <see cref="AzureBicepResource"/> but can be annotated with
///         <see cref="AzureBicepResourceAnnotation"/> by using the AzureSqlExtensions.AsAzureSqlDatabase() extension method.
///     </para>
///     <code lang="csharp">
///         var builder = DistributedApplication.CreateBuilder();
///         builder.AddAzureProvisioning();
///         var sql = builder.AddSqlServerServer("sql"); // This resource would not be deployable via Azure Provisioner.
///         sql.AsAzureSqlDatabase(); // ... but it now is because this adds the AzureBicepResourceAnnotation annotation.
///     </code>
/// </remarks>
public class AzureBicepResourceAnnotation(AzureBicepResource resource) : IResourceAnnotation
{
    /// <summary>
    /// The <see cref="AzureBicepResource"/> derived resource.
    /// </summary>
    public AzureBicepResource Resource => resource;
}