外部参数

环境为要在其中运行的应用程序提供上下文。 参数表示在运行应用时请求外部值的能力。 参数可用于在本地运行时向应用提供值,或者在部署时提示值。 它们可用于为各种方案建模,包括机密、连接字符串和其他可能因环境而异的配置值。

参数值

参数值是从应用主机配置 Parameters 部分读取的,用于在本地运行时向应用提供值。 发布应用时,如果未配置该值,系统会提示你提供它。

请考虑以下示例应用主机 Program.cs 文件:

var builder = DistributedApplication.CreateBuilder(args);

// Add a parameter named "value"
var value = builder.AddParameter("value");

builder.AddProject<Projects.ApiService>("api")
       .WithEnvironment("EXAMPLE_VALUE", value);

前面的代码将名为 value 的参数添加到应用主机。 然后将该参数作为名为 EXAMPLE_VALUE的环境变量传递给 Projects.ApiService 项目。

配置参数值

向生成器添加参数只是配置的一个方面。 还必须提供参数的值。 可以在应用主机配置文件中提供该值,将其设置为用户密码,或在 其他标准配置进行配置。 如果未找到参数值,则会在发布应用时请求输入这些值。

请考虑以下应用主机配置文件 appsettings.json

{
    "Parameters": {
        "value": "local-value"
    }
}

前面的 JSON 在应用主机配置的 Parameters 部分中配置参数。 换句话说,该应用主机能够找到其配置的参数。 例如,你可以访问 IDistributedApplicationBuilder.Configuration,并使用 Parameters:value 键访问该值:

var builder = DistributedApplication.CreateBuilder(args);

var key = $"Parameters:value";
var value = builder.Configuration[key]; // value = "local-value"

重要

但是,无需在应用主机中自行访问此配置值。 相反,ParameterResource 用于将参数值传递给依赖资源。 通常作为环境变量。

清单中参数的表示形式

.NET .NET Aspire 使用 部署清单 来表示应用的资源及其关系。 参数在清单中表示为名为 parameter.v0的新基元:

{
  "resources": {
    "value": {
      "type": "parameter.v0",
      "value": "{value.inputs.value}",
      "inputs": {
        "value": {
          "type": "string"
        }
      }
    }
  }
}

机密值

参数可用于为机密建模。 将参数标记为机密时,它将作为清单的提示,指示值应被视为机密。 发布应用时,系统会提示该值并将其存储在安全位置。 在本地运行应用时,将从应用主机配置的 Parameters 部分读取该值。

请考虑以下示例应用主机 Program.cs 文件:

var builder = DistributedApplication.CreateBuilder(args);

// Add a secret parameter named "secret"
var secret = builder.AddParameter("secret", secret: true);

builder.AddProject<Projects.ApiService>("api")
       .WithEnvironment("SECRET", secret);

builder.Build().Run();

现在,请考虑以下应用主机配置文件 appsettings.json

{
    "Parameters": {
        "secret": "local-secret"
    }
}

清单表示形式如下所示:

{
  "resources": {
    "value": {
      "type": "parameter.v0",
      "value": "{value.inputs.value}",
      "inputs": {
        "value": {
          "type": "string",
          "secret": true
        }
      }
    }
  }
}

连接字符串值

参数可用于为连接字符串建模。 发布应用时,系统会提示该值并将其存储在安全位置。 在本地运行应用时,将从应用主机配置的 ConnectionStrings 部分读取该值。

注意

连接字符串用于表示各种连接信息,包括数据库连接、消息代理、终结点 URI 和其他服务。 在 .NET.NET Aspire 名词中,术语“连接字符串”用于表示任何类型的连接信息。

请考虑以下示例应用主机 Program.cs 文件:

var builder = DistributedApplication.CreateBuilder(args);

var redis = builder.AddConnectionString("redis");

builder.AddProject<Projects.WebApplication>("api")
       .WithReference(redis);

builder.Build().Run();

现在,请考虑以下应用主机配置文件 appsettings.json

{
    "ConnectionStrings": {
        "redis": "local-connection-string"
    }
}

有关连接字符串及其在部署清单中的表示形式的详细信息,请参阅 连接字符串和绑定引用

参数示例

若要表达参数,请考虑以下示例代码:

var builder = DistributedApplication.CreateBuilder(args);

var db = builder.AddSqlServer("sql")
                .PublishAsConnectionString()
                .AddDatabase("db");

var insertionRows = builder.AddParameter("insertionRows");

builder.AddProject<Projects.Parameters_ApiService>("api")
       .WithEnvironment("InsertionRows", insertionRows)
       .WithReference(db);

builder.Build().Run();

执行以下步骤:

  • 添加名为 sql 的 SQL Server 资源,并将其发布为连接字符串。
  • 添加名为 db的数据库。
  • 添加名为 insertionRows的参数。
  • 添加一个名为 api 的项目,并将其与 Projects.Parameters_ApiService 项目资源类型参数相关联。
  • insertionRows 参数传递给 api 项目。
  • 引用 db 数据库。

从应用主机配置文件的 Parameters 部分读取 insertionRows 参数的值:appsettings.json

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning",
      "Aspire.Hosting.Dcp": "Warning"
    }
  },
  "Parameters": {
    "insertionRows": "1"
  }
}

Parameters_ApiService 项目使用 insertionRows 参数。 请考虑 Program.cs 示例文件:

using Microsoft.EntityFrameworkCore;

var builder = WebApplication.CreateBuilder(args);

int insertionRows = builder.Configuration.GetValue<int>("InsertionRows", 1);

builder.AddServiceDefaults();

builder.AddSqlServerDbContext<MyDbContext>("db");

var app = builder.Build();

app.MapGet("/", async (MyDbContext context) =>
{
    // You wouldn't normally do this on every call,
    // but doing it here just to make this simple.
    context.Database.EnsureCreated();

    for (var i = 0; i < insertionRows; i++)
    {
        var entry = new Entry();
        await context.Entries.AddAsync(entry);
    }

    await context.SaveChangesAsync();

    var entries = await context.Entries.ToListAsync();

    return new
    {
        totalEntries = entries.Count,
        entries
    };
});

app.Run();

另请参阅