首先,没有必要将用户机密添加到您的类库中,因为没有任何东西会拾取它们。配置系统实际上并不关心您的选项 POCO 存在于哪个程序集中,特别是因为 Microsoft.Extensions.Configuration(这是加载用户机密的位置)仅与 Microsoft.Extensions.Options (您的 POCO是为了)。
由于您是通过选项模式使用配置的,只要将依赖注入系统配置为正确地提供配置选项的所有配置源,您的库中的代码就不必担心太多。
因此,如果您在两个(执行)程序集中的用户机密方面遇到问题,那么这与它们的配置方式有关。由于您有一个 ASP.NET Core Web 应用程序和一个辅助服务,我将假设您正在为这两个项目使用主机构建器。在这种情况下,您不必担心设置配置源,因为主机构建器带有一个合理的默认值,其中包含开发模式下的用户机密。
对于它的价值,如果您遇到需要将用户机密配置为配置提供程序,您应该知道IConfigurationBuilder.AddUserSecrets
扩展方法通常会期望您传入一个程序集,该程序集从.csproj
文件中的项目配置中识别用户机密。– 如果您使用的是默认主机构建器,那么它将为您设置并使用您的项目的程序集,这通常是您想要做的。
正如您自己发现的那样,3.1 存在一个未解决的错误,这将阻止用户机密为 Worker 项目模板开箱即用。原因是底层项目 SDK 忘记处理<UserSecretsId>
用于识别用户项目的 MSBuild 属性。
幸运的是,有一个简单的解决方法可以解决这个问题:您需要做的就是添加对Microsoft.Extensions.Configuration.UserSecrets
包的显式引用。该包已被Microsoft.Extensions.Hosting
Worker 项目模板中默认包含的 隐式引用,但通过再次显式添加它,您将启用一些神奇的 MSBuild 位,以使项目正确获取用户机密。
所以你的项目模板应该是这样的:
<Project Sdk="Microsoft.NET.Sdk.Worker">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<UserSecretsId>fb8be4c5-1316-42a7-8c30-3a752ed21c09</UserSecretsId>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.8" />
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="3.1.8" />
</ItemGroup>
</Project>