.NET Core中的跨库JSON配置

brgchamk  于 2023-01-06  发布在  .NET
关注(0)|答案(1)|浏览(135)

假设我有一些项目,一个库Foo和两个项目BarBaz,它们依赖于FooFoo包含一些将在BarBaz之间共享的配置,但是BarBaz也将执行一些在它们之间不同的配置。
Foo中,我有一个配置文件:

/* /dev/Foo/fooConfig.json */
{
   "lorem": "ipsum",
   "dolor": "set"
}

以及执行初始配置的方法:

/* /dev/Foo/configuration.cs */
public static IConfigurationBuilder BuildBaseConfiguration()
{
   return new ConfigurationBuilder()
      .AddJsonFile("fooConfig.json")
}

Bar中,我有类似的代码:
一个二个一个一个
通常,Foo作为NuGet包分发,但在开发过程中,我通过包含以下Bar.csproj在本地引用它:

<Reference Include="Foo">
   <HintPath>../Foo/bin/Debug/net6.0/Foo.dll</HintPath>
</Reference>

我已经确保fooConfig.json被复制到输出目录,并且在成功运行构建后它确实出现了。
但是,在运行Bar之后,我得到了以下错误:
System.IO.FileNotFoundException:未找到配置文件"fooConfig.json",该文件不是可选的。预期的物理路径为"/dev/Bar/bin/Debug/net6.0/fooConfig.json "。
看起来. NET核心正在使用基于运行时工作目录的相对文件路径(/dev/Bar/bin/Debug/net6.0)而不是文件实际保存的位置(../Foo/bin/Debug/net6.0/fooConfig.json)来查找配置文件。
如何纠正这种行为,以便. NET核心引用fooConfig.json的真实位置?

zbq4xfa0

zbq4xfa01#

默认情况下,ConfigurationBuilder使用AppContext.BaseDirectory(参见源代码)作为文件搜索的根目录。您可以尝试如下操作来覆盖此行为:

// for development environment:
var compositeFileProvider = new CompositeFileProvider(new[]
{
    new PhysicalFileProvider(AppContext.BaseDirectory),
    new PhysicalFileProvider(Path.GetDirectoryName(typeof(SomeTypeFromFooDll).Assembly.Location))
});
var cfgBuilder = new ConfigurationBuilder()
    .SetFileProvider(compositeFileProvider);
// ... rest of cfg setup

附言
就我个人而言,我认为库不应该附带它的配置文件,我会以这样的方式重构代码,它公开了设置类型(带有一些默认值),并由消费项目来处理这些。

相关问题