处理多个项目时的.NET Core 2.0 appsettings.json文件位置

时间:2018-04-17 20:27:18

标签: .net-core

我正在使用由多个项目组成的.NET Core 2.1.103 WebAPI应用程序。每个项目都需要有自己的appsettings.json文件。每个项目都在一个主要的解决方案中的自己的子目录中。夹。这是目录结构的简化版本,其中包含我的问题的相关目录:

c:\code\my_big_solution
c:\code\my_big_solution\project1
c:\code\my_big_solution\project1\bin\Debug
c:\code\my_big_solution\project2
c:\code\my_big_solution\project2\bin\Debug
c:\code\my_big_solution\project3
c:\code\my_big_solution\project3\bin\Debug

我很难弄清楚每个appsettings.json文件必须去哪里以及如何阅读它们。我在阅读其他帖子时假设我应该自动将每个项目的appsettings.json文件复制到其关联的{{ 1}}目录。如果是这种情况,我不确定如何使用Startup构造函数。我的理解是,这是从appsettings.json文件中读取值的.NET Core 2.0方法:

bin\Debug

public Startup(IConfiguration configuration) { Configuration = configuration; string myString = Configuration["blah:blah:blah"]; 似乎从configuration获取了appsettings.json文件,而不是c:\code\my_big_solution或我要从中提取的任何项目c:\code\my_big_solution\project1\bin\Debug目录。< / p>

我无法弄清楚如何从所需的目录中提取,除了执行.NET Core 1.x之类的方式之外,还可以通过更改构造函数来实现这一目标&#39 ;传递Debug并使用IHostingEnvironment

ConstructorBuilder

虽然第二种解决方案可行,但这让我感到困惑,因为我认为还有更多正确的解决方案。在.NET Core 2.0中执行此操作的方法。有吗?

2 个答案:

答案 0 :(得分:4)

我弄清楚发生了什么事。在launch.json文件中,我没有为cwd参数设置正确的路径。这就是为什么Startup()在错误的地方寻找appsettings.json文件的原因。

答案 1 :(得分:3)

您可能已经意识到,正在执行的项目决定了它在appsettings.json文件中的位置。

这意味着默认情况下,在ASP.NET Core 2项目中,WebHost.CreateDefaultBinder从该项目的执行项目内容根目录加载appsettingsjson。

如果您的其他项目是类库,那么为每个项目设置单独的appsettings.json将不起作用。只有一个可执行程序,比如你提到的WebAPI项目,它将从它自己的根文件夹中读取它。

但是,如果你的所有项目都是可执行文件,那么只需在每个项目的根目录中添加appsettings.json文件,只需通过.csproj设置它们就可以自动将它们复制到输出文件夹中:

  <ItemGroup>
    <Content Update="appsettings.json">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
      <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
    </Content>
  </ItemGroup>

在IDE中,如Visual Studio或JetBrains Rider,您也可以通过右键单击属性来直观地配置它。

N.B。如果要在所有项目之间使用单个共享文件,可能会感兴趣this question