.net - 使用 WebApplicationFactory,在 Program.cs 执行之前添加配置源
问题描述
我正在使用新的最小 .NET 6 托管模型,并且进行了集成测试。
显然Program.cs
需要配置值,所以我想使用自定义appsettings.Test.json
文件。文档说我可以使用ConfigureAppConfiguration
,但它的委托在 之后运行Program
,因此Program
没有配置。这是添加到Minimal API Playground 示例代码中的代码:
internal class PlaygroundApplication : WebApplicationFactory<Program>
{
private readonly string _environment;
public PlaygroundApplication(string environment = "Development")
{
_environment = environment;
}
protected override IHost CreateHost(IHostBuilder builder)
{
builder.UseEnvironment(_environment);
builder.ConfigureAppConfiguration(config =>
{
config.AddJsonFile(appSettings); // runs AFTER Program.cs
});
// Add mock/test services to the builder here
builder.ConfigureServices(services =>
{
});
return base.CreateHost(builder);
}
}
我怎样才能提供配置Program.cs
?
var builder = WebApplication.CreateBuilder(args);
var keyVaultName = builder.Configuration["KeyVaultName"]; // null
builder.Configuration.AddAzureKeyVault(new SecretClient(
new Uri($"https://{keyVaultName}.vault.azure.net/"),
new DefaultAzureCredential()), new KeyVaultSecretManager());
我可以将环境设置为Test
然后在程序中执行:
var builder = WebApplication.CreateBuilder(args);
builder.Configuration.AddJsonFile($"appsettings.{builder.Environment.EnvironmentName}.json");
var keyVaultName = builder.Configuration["KeyVaultName"]; // has value from json
builder.Configuration.AddAzureKeyVault(new SecretClient(
new Uri($"https://{keyVaultName}.vault.azure.net/"),
new DefaultAzureCredential()), new KeyVaultSecretManager());
但这是正确的吗?
解决方案
根据https://github.com/dotnet/aspnetcore/issues/37680的说法,不幸的是,目前无法通过编写代码的方式实现这一点。
推荐阅读
- sql-server - 查找列中每个单词的 SOUNDEX
- r - 如何从矩阵中删除任何内容?
- android - 带有 GridLayoutManager 和 cardview 的 RecyclerView 内的毕加索图像
- node.js - 如何将参数从一个脚本传递到`package.json`中的另一个脚本?
- python - 用python打开损坏的tar文件
- python - 如何从右侧拆分单词/数字和符号模式的字符串
- svg - getComputedStyle 和 getBoundingClientRect
- pandas - 在 Pandas 中基于另一个值缩放一个值
- java - 我想将 product1 的 Elastic search 2.3.5 中的数据保存到 ProductV2 的 Elastic search 6.2
- html - 带有没有目标属性的链接的 CSS 选择器