.net6.0 c# 共享 appsettings.json

.net6.0 c# shared appsettings.json

我正在研究一个多租户 .net6.0 解决方案,其中包含许多嵌入式项目

为了降低维护成本,我想集中使用/link 一个单独的应用程序设置。{environment}。JSON 用于整个解决方案,并让每个项目引用适当的文件。

所以我目前正在尝试在控制台应用程序(将作为网络作业部署)中进行设置,并且我在 dotnet 运行.

上遇到了一个非常奇怪的行为

在此控制台应用程序中,我在项目文件中添加了指向 sharedsettings.json 的路径,即

<ItemGroup>
        <Content Include="..\SharedSettings\sharedsettings.development.json">
            <CopyToOutputDirectory>Always</CopyToOutputDirectory>
        </Content>
        <Content Include="..\SharedSettings\sharedsettings.production.json">
            <CopyToOutputDirectory>Always</CopyToOutputDirectory>
        </Content>
        <Content Include="..\SharedSettings\sharedsettings.staging.json">
            <CopyToOutputDirectory>Always</CopyToOutputDirectory>
        </Content>
</ItemGroup>

当我 运行 应用程序使用播放按钮时,即通过 Visual Studio 中的部署构建,我可以读取文件的内容并建立所需的配置设置。

但是,当我执行 dotnet 运行 时,所需 JSON 路径的应用程序设置(来自同一文件)returns null。

这是program.cs

中的代码
//load the correct environment variables, i.e. Sevelopment / Staging / Production appsettings.JSON
string deployJSON = $"sharedsettings.{environment}.json";
string[] localPath = new string[] { "..", "SharedSettings", deployJSON };
var localJSON = Path.Combine(localPath);
Console.WriteLine(Directory.GetCurrentDirectory()); 

            Configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile(localJSON, true, true)
                .AddJsonFile(deployJSON, true, true)
                .AddEnvironmentVariables()
                .Build();

string queueName = Configuration.GetValue<string>("ConnectionStrings:ServiceBusName");
string serviceBusConnection = Configuration.GetValue<string>("ConnectionStrings:ServiceBusConnectionString");

Console.WriteLine(queueName);
Console.WriteLine(serviceBusConnection);

我已经使用 file.exists 来确认我可以访问该文件,但我很困惑为什么当我尝试访问 dotnet 运行.[=13= 时结果为空]

然后我应该能够引用 sharedsettings.json 作为本地文件

我现在正在做的是;

  1. 在部署中包含外部文件
  <ItemGroup>
    <Content Include="..\SharedSettings\sharedsettings.development.JSON" Link="sharedsettings.development.JSON">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Include="..\SharedSettings\sharedsettings.JSON" Link="sharedsettings.JSON">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Include="..\SharedSettings\sharedsettings.production.JSON" Link="sharedsettings.production.JSON">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Include="..\SharedSettings\sharedsettings.staging.JSON" Link="sharedsettings.staging.JSON">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
  </ItemGroup>
  1. 添加外部文件(作为 link) [这里]https://andrewlock.net/including-linked-files-from-outside-the-project-directory-in-asp-net-core/

  2. 在配置生成器中引用文件,就好像它是本地文件一样

            Configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile($"..\SharedSettings\sharedsettings.{environment}.JSON", true, true)
                .AddJsonFile($"sharedsettings.{environment}.json", true, true)
                .AddEnvironmentVariables()
                .Build();

构建是完美的,但是 dotnet 运行 仍然有 NULL 值引用,除非我硬添加共享设置文件,即将它们嵌入每个项目而不是作为 link。 :生气:

            Configuration = new ConfigurationBuilder()
            .SetBasePath(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location))
            //.SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile($"..\SharedSettings\sharedsettings.{environment}.JSON", true, true)
            .AddJsonFile($"sharedsettings.{environment}.json", true, true)
            .AddEnvironmentVariables()
            .Build();

this one 类似的问题。

这一切都与基本路径有关。