nmp*_*uls 1 dependency-injection asp.net-core azure-functions
在我的函数应用程序(.NET 7.0,独立工作线程)中,我有一个使用 API 密钥的特定依赖项,该依赖项需要放入秘密存储中。我正在使用用户机密进行本地开发,但在配置依赖注入服务时,我一直困惑于如何访问这些机密值:
// secrets.json
{
"apiKey": "1234567890"
}
Run Code Online (Sandbox Code Playgroud)
// Program.cs
var host = new HostBuilder()
.ConfigureFunctionsWorkerDefaults()
.ConfigureServices(s =>
{
string apiKey = ???; // how to access user secrets here?
s.AddScoped<IMyDependency>(sp => new MyDependency(apiKey));
});
.Build();
}
host.Run();
Run Code Online (Sandbox Code Playgroud)
Microsoft 提供了有关使用用户机密的指南:
但是这些解决方案都没有提供我所需要的,这是在设置依赖项注入时访问用户秘密值的一种方法。相反,推荐的解决方案使配置值本身注入依赖项,这是我无法使用的。
我尝试过的事情:
Environment.GetEnvironmentVariable,它不返回值。builder.AddUserSecrets。我不知道这是否有必要这样做,但即使有必要,我仍然不知道在设置 DI 时如何访问配置。我已按照您提供的相同MSDoc来设置 UserSecrets。
我的.csproj文件:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<AzureFunctionsVersion>v4</AzureFunctionsVersion>
<OutputType>Exe</OutputType>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<UserSecretsId>****-d46c-****-9752-04-****</UserSecretsId>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.10.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Http" Version="3.0.13" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.7.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="6.0.1" />
</ItemGroup>
<ItemGroup>
<None Update="host.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="local.settings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<CopyToPublishDirectory>Never</CopyToPublishDirectory>
</None>
</ItemGroup>
<ItemGroup>
<Using Include="System.Threading.ExecutionContext" Alias="ExecutionContext" />
</ItemGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)
Program.cs文件:
Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System.Reflection;
var host = new HostBuilder()
.ConfigureFunctionsWorkerDefaults()
.ConfigureAppConfiguration(con =>
{
con.AddUserSecrets<Program>(optional:true,reloadOnChange:false);
})
.ConfigureServices(s =>
{
var config = s.BuildServiceProvider().GetService<IConfiguration>();
string apiKey = config.GetValue<string>("apiKey");
})
.Build();
host.Run();
Run Code Online (Sandbox Code Playgroud)
[编辑] - 我想向其他搜索者澄清并补充一点,虽然这看起来很明显,但 AddUserSecrets() 格式是使其适用于较新的 Program.cs 构造的唯一方法。Startup 示例无处不在,并且 AddUserSecrets() 似乎在不指定的情况下隐式工作,但仅适用于 Startup 样式。但我在互联网上找不到任何提及。程序是隐式的,因为不再有实际的 Startup 类。
如果不在用户 sercets id 中进行硬编码,我就无法让 User Secrets 为我服务,这显然是不可接受的。
输出:

| 归档时间: |
|
| 查看次数: |
1315 次 |
| 最近记录: |