.NET Aspire 外部参数 (External parameters)

https://learn.microsoft.com/en-us/dotnet/aspire/fundamentals/external-parameters

环境提供应用运行的上下文。Parameter 提供了在应用运行中请求外部值的功能。当应用本地运行的时候,Parameter 可以为应用提供值,或者在应用部署的时候,提示值。Parameter 可以用于建模各种场景,包括密钥,连接串,以及其它在各种环境下变得不同的配置值。

参数值

参数的值可以通过 app host 的配置读取,然后用于本地运行的应用。当部署应用的时候,实际的值会通过参数值来获得。

考虑下面的 app host 的 Program.cs 示例。

var builder = DistributedApplication.CreateBuilder(args);

// Add a parameter
IResourceBuilder<ParameterResource> value = builder.AddParameter("value"); builder.AddProject<Projects.ApiService>("api")
.WithEnvironment("EXAMPLE_VALUE", value);

相应的 appsettings.json 为:

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

参数在清单中表示为名为 parameter.v0 的新基元:

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

密钥

参数 Parameter 还可以用来建模密钥。当一个 Parameter 标记为密钥的时候,它提示清单该值应该被看做密钥。在部署中需要提示并保存在安全的位置。

当在本地运行的时候,该值将通过 app host 的配置中的 Parameters 配置节中读取出来。

考虑下面的 app host 中的 Program.cs 代码示例:

var builder = DistributedApplication.CreateBuilder(args);

// Add a secret parameter
var secret = builder.AddParameter("secret", secret: true); builder.AddProject<Projects.ApiService>("api")
.WithEnvironment("SECRET", secret); builder.Build().Run();

现在考虑相应的 app host 中如下的 appsettings.josn

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

清单文件中的表示如下:

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

连接串的值

Parameter 还可以用来建模连接串。在部署中,该值将被提示并保存到安全的位置。

当本地运行的时候,该值将通过 app host 的配置中的 ConnectionString 配置节中读取出来。

注意

连接串用来表示广义的连接信息,包括数据库连接串,消息中间件,以及其它服务。

在 .NET Aspire 的命名方式中,术语 connection string 用来表示任意类型的连接信息。

考虑如下的 app host 的 Program.cs 示例

var builder = DistributedApplication.CreateBuilder(args);

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

builder.AddProject<Projects.WebApplication1>("api")
.WithReference(redis); builder.Build().Run();

相应的 app host 的 appsettings.json 如下所示

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

清单表示如下所示

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

Parameter 示例

为了表示 Parameter,考虑如下的示例代码:

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 的 Parameter
  • 添加了名为 api 的项目,将其关联到项目 Projects.Parameters_ApiService 项目资源类型参数上
  • 将参数 insertionRows 传递给 api 项目
  • 引用 db 数据库

其中的 insertionRows 参数从 app host 的 appsettings.json 中的 Parameters 配置节中读取。

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

而 Parameters_ApiService 项目消费该 insertionRows 参数,考虑 apiService 项目中的 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 外部参数 (External parameters)的更多相关文章

  1. Swift Internal Parameter and External Parameter 外部参数和内部参数

    今天跟大神又学习了些关于IOS开发Swift语言的外部参数和内部参数 func doSomething(num1: Int, num2: Int) -> Int { return num1 + ...

  2. FLEX接收外部参数 .

    FLEX参数传递与FLASH有点不同 login..swf?name=aa&password=bb Flex上是这样接收参数的 myname=mx.core.Application.appli ...

  3. Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数

    Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数 7.4.4  为外部参数设置默认值 开发者也可以对外部参数设置默认值.这时,调用的时候,也可以省略参数传递本文选自Swift1 ...

  4. Swift 1.1语言函数参数的特殊情况本地参数名外部参数名

    Swift 1.1语言函数参数的特殊情况本地参数名外部参数名 7.4  函数参数的特殊情况 声明定义有参函数时,为函数的每一个参数都定义了参数名称.根据参数名定义的形式不同,函数参数包括本地参数和外部 ...

  5. awk 传入外部参数

    awk 传入外部参数 num1=1.1 num2=2.2 result=$(awk -v n1=$num1 -v n2=$num2 'BEGIN{print (n2>n1)?1:0}')

  6. Swift - 28 - 内部参数名和外部参数名

    //: Playground - noun: a place where people can play import UIKit // 外部参数的作用是为了让程序员调用代码的时候能清晰的看出所传参数 ...

  7. Mybatis(二)参数(Parameters)传递

    Mybatis参数(Parameters)传递  1..单个参数 可以接受基本类型,对象类型,集合类型的值.这种情况MyBatis可直接使用这个参数,不需要经过任何处理. <!-- 根据id查询 ...

  8. c语言3种链接属性: 外部(external), 内部(internal),无设置(none)

    c语言中,多个文件组合的时候,有可能标示名相同,那么这个时候编译器如何判别的呢?    c语言中有3种链接属性: 外部(external), 内部(internal),无设置(none)    外部( ...

  9. Swift函数_外部参数名,

    //1________________ /** *没使用外部参数名的函数 */ func inputScore(name:String,score1:Int,score2:Int) { } /** * ...

  10. Swift开发经验——外部参数名

    一.什么是外部参数名? 浅显地说,外部参数名就是在调用一个方法时要在方法的参数前面加上一个特定的名字,目的是便于阅读代码,提高维护效率.   二.在最新的Xcode中,外部参数名的性质与用法如下 性质 ...

随机推荐

  1. Docker修改IP地址方法

    一.查看Docker IP root@master:/# ifconfig docker0 docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu ...

  2. Adobe Acrobat XI Pro 打开pdf报错 109

    事件起因: 某同事在使用 Adobe Acrobat XI Pro 打开pdf文件时,会偶发性的报错 "处理页面时发生错误.读取本文当时出现问题(109)."   解决办法: 在网 ...

  3. LNMP 和 LAMP 对比 (仅供参考)

    Nginx 性能稳定.功能丰富.运维简单.处理静态文件速度快且消耗系统资源极少. Apache 是 LAMP 架构最核心的 Web Server,开源.稳定.模块丰富是 Apache 的优势.但 Ap ...

  4. 【赵渝强老师】SQL的字符函数

    字符函数,顾名思义,操作的就是字符串.通过下图,我们来了解一下Oracle的字符函数. 一.大小写控制函数 lower.upper.initcap select lower('Hello World' ...

  5. USB协议详解第8讲(USB描述符-字符串和语言ID描述符)

    1.字符串描述符相关概念 字符串描述符:首先,字符串描述符就是用字符串描述一个设备的一些属性,毕竟人能看懂的是字符,而不是十六进制,描述的属性包括设备厂商名字.产品名字.产品序列号.各个配置名字.各个 ...

  6. 系统 内核启动期间使用ftrace

    启动阶段使能event trace 同上,配置commandline: trace_event=sched:*,timer:*,irq:* trace_buf_size=40M 有上面的实例可以知道, ...

  7. stm32开发

    基于寄存器开发 新建工程 添加C/C++识别路径 : 防止中文乱码 -  改变编码格式 基于库函数开发

  8. 01-react的基本使用

    // 导入react和react-dom包 类似 vue 中的 import vue from 'vue' import react from 'react' // 内部的组件 import reac ...

  9. KubeSphere Helm 应用仓库源码分析

    作者:蔡锡生,LStack 平台研发工程师,近期专注于基于 OAM 的应用托管平台落地. 背景介绍 KubeSphere 应用商店简介 作为一个开源的.以应用为中心的容器平台,KubeSphere 在 ...

  10. 不用PLC和板卡,一台电脑就可以控制伺服

    1.前言 大家好!我是付工. EtherCAT是运动控制领域使用最广泛的总线通信协议之一. 如果我们只有一台电脑,能不能直接控制EtherCAT总线伺服呢? 这个是完全可以的. 我们可以在电脑上安装实 ...