.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. Python实现多维傅里叶变换

    技术背景 在前面一篇文章中,我们介绍了一维离散傅里叶变换和快速傅里叶变换的基本原理和简单的代码实现.本文补充一个多维傅里叶变换的场景,以及简单的Python实现. 二维傅里叶变换 首先回顾一下上一篇文 ...

  2. 腾讯自研Git客户端,助力每个人都可以轻松使用Git

    工具介绍 UGit是一款腾讯自研的Git客户端,为了让每个人都可以轻松使用Git,从而提高开发效率和团队协作的流畅性.支持工蜂MR/CR,工蜂议题管理,另外对于Git的原生特性有着深度支持. 支持的系 ...

  3. Android Qcom USB Driver学习(十)

    本章主要是基于之前的学习,实现一个hidraw的驱动,发现有两种用于识别usb设备的方式,放别是usb_device_id和hid_device_id hid_probe (1)hid_device_ ...

  4. iOS开发中UITextView使用小结

    最近项目开发中用到了多行文本框限制文字输入个数限制,之前的话在textViewDidChange方法中截取超出字数就可以.测试人员发现在拼音转汉字的过程中,YYTextView不会二次确认textVi ...

  5. 使用DBeaver连接高斯100数据库 gaussdb100

    1. 自定义驱动 参考:DBeaver配置GaussDB 100指导手册-云社区-华为云 (huaweicloud.com) 搜索_华为云 (huaweicloud.com) DBeaver连接华为高 ...

  6. vue项目中的package.json的private选项的作用

    { "name": "项目名称", "description": "描述", "version": ...

  7. AtCoder Beginner Contest 371(ABCDE)

    A 个人直接硬解,讨论情况也并不复杂 代码: #include<bits/stdc++.h> #define int long long using namespace std; cons ...

  8. Litmus 实践:让群魔在混沌中乱舞,看 K8s 能撑到何时

    对于云服务而言,如果系统出现异常,将会带来很大的损失.为了最大程度地降低损失,我们只能不断探寻系统何时会出现异常,甚至缩小到某些特定参数变化是否会造成系统异常.然而随着云原生的发展,不断推进着微服务的 ...

  9. 第147篇:微信小程序开发中Promise的使用(aysnc,await)

    好家伙, 0.错误描述 今天在开发中犯了一个比较严重的错误 对于Promise的错误使用 场景: 微信小程序中展示搜索条件列表 // API请求工具函数 const apiRequest = (url ...

  10. Elasticsearch倒排索引结构【转载】

    一切设计都是为了提高搜索的性能 倒排索引(Inverted Index)也叫反向索引,有反向索引必有正向索引.通俗地来讲,正向索引是通过key找value,反向索引则是通过value找key. 先来回 ...