外部参数
环境为要在其中运行的应用程序提供上下文。 参数表示在运行应用时请求外部值的能力。 参数可用于在本地运行时向应用提供值,或者在部署时提示值。 它们可用于为各种方案建模,包括机密、连接字符串和其他可能因环境而异的配置值。
参数值
参数值是从应用主机配置 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();
另请参阅
- 部署工具生成器 的
清单格式 - 教程:使用 .NET Aspire 和 Entity Framework Core 将 ASP.NET Core 应用连接到 SQL Server