.net6.0 c# shared appsettings.json

h5qlskok  于 2023-05-19  发布在  .NET
关注(0)|答案(3)|浏览(133)

我正在开发一个多租户的.net6.0解决方案,它有许多嵌入式项目
为了降低维护成本,我希望将整个解决方案集中并使用/链接一个单独的appsettings.{environment}.JSON,并让每个项目引用相应的文件。
所以我目前正在尝试在一个控制台应用程序中设置它(它将被部署为一个webjob),我在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路径(来自同一个文件)的appsettings返回null。
这是程序中的代码. 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时结果为null。

ssgvzors

ssgvzors1#

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的问题。
这一切都与基础路径有关。

dgenwo3n

dgenwo3n2#

然后我shuold能够引用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.添加外部文件(作为链接)[此处] https://andrewlock.net/including-linked-files-from-outside-the-project-directory-in-asp-net-core/
1.在配置生成器中引用该文件,就像它是本地文件一样

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

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

insrf1ej

insrf1ej3#

这是一个迟来的答案,但在尝试了不同的方法后,我最终在我的项目的.csproj文件中得到了这个答案:

<Target Name="CopyAppSettings" BeforeTargets="BeforeBuild">
    <Copy SourceFiles="path_to_shared_appsettings/appsettings.json" DestinationFolder="./" SkipUnchangedFiles="true" />
</Target>

这将在每次生成之前将appsettings复制到项目文件夹。

相关问题