我们有一个微服务架构,其中大多数服务都使用
Microsoft.NET.Sdk
。由于我们有许多共享配置,因此我们有一个库,可以使用 global-appsettings.json
预先配置每个服务。由于我们将该全局配置文件复制到输出目录,因此该配置效果很好。但是,现在我们有一项需要 Microsoft.NET.Sdk.Web
SDK 的服务。由于某种原因,此服务不会在输出目录中查找应用程序设置;相反,它只在源目录中查找它们。我尝试了各种方法来尝试找出问题所在,但我还没有找到解决方案:
将新服务的SDK更改为
Microsoft.NET.Sdk.Web
时,发现global-appsettings.json
没有任何其他更改。 (这只是为了测试这一点,并不是一个可行的解决方案)
将
global-appsettings.json
复制到新服务的源时,它也可以工作,但这也是次优的,因为我们不想维护两个相同的文件并破坏它们的好处
通过以下属性添加链接不起作用,这意味着服务未找到该文件:
<Content Include="..\..\..\shared\Rapidata.Shared.Configuration\global-appsettings.Development.json">
<Link>global-appsettings.Development.json</Link>
</Content>
那么,在使用 Web SDK 时如何引用共享库中的设置文件?
根据你的描述,我建议你可以使用
builder.Configuration.AddJsonFile
方法使用global-appsettings.json设置正确的路径,然后它就可以得到它。
根据您共享的配置,
global-appsettings.Development.json
文件似乎位于Microsoft.NET.Sdk.Web项目的父文件夹内。
我建议你可以使用
Directory.GetParent(builder.Environment.ContentRootPath).FullName
获取当前应用程序的父路径,然后使用 Path.Combine
方法构建完整路径。最后使用正确的路径设置配置文件。
更多详情,您可以参考下面的例子:
请注意:我的测试文件就在应用程序的根父路径中,您可以再次调用
Directory.GetParent
来获取父路径的父路径。
var sharedConfigPath = Path.Combine(Directory.GetParent(builder.Environment.ContentRootPath).FullName, "Rapidata.Shared.Configuration");
builder.Configuration.AddJsonFile(Path.Combine(sharedConfigPath, "appsettings.json"), optional: true, reloadOnChange: true);
var test = builder.Configuration["test"];
结果: