首页 > 解决方案 > .net core 中的设置层次结构

问题描述

我想混合使用 .net 核心和 .net 框架应用程序共享共同的 app.configs。

例如 :

app.settings
\WebAppOne\app.settings
\WebAppOne\SubAppOneA\app.settings
\WebAppTwo\app.settings

我希望能够将这些应用程序发布到 IIS,并且在 WebAppOne\SubAppOneA 中能够从根 app.Settings 以及 \WebAppOne\app.settings 中提取设置

我已经尝试过构建应用程序,并尝试通过 ConfigurationManager 访问设置,希望它能开箱即用:

this.LocalConnectionString = ConfigurationManager.ConnectionStrings["myDb"].ConnectionString;
this.ChildConnectionString = ConfigurationManager.ConnectionStrings["childDb"].ConnectionString;

但很明显,这并没有像我希望的那样奏效。有没有办法做到这一点?

标签: c#.net-coreconfigurationapp-config

解决方案


你的标题表明你想要Microsoft.Extensions.Configuration为你的配置。这也可以在完整的框架项目中使用,并且还支持 XML

对于您要使用的分层方案,您必须自己实现:如何搜索 XML 文件以及它们应该如何分层。

使用 .NET Core 配置配置系统时,不能使用ConfigurationManager. 相反,您将不得不使用IConfiguration. 您可以直接使用读取值,IConfiguration但我建议使用选项模式或至少将配置绑定到使用ConfigurationBinder.

下面是一个关于如何Microsoft.Extensions.Configuration在 .NET Core 之外使用及其提供的托管模型的最小示例:

对于初学者来说,这是一个配置文件:

<?xml version="1.0" encoding="utf-8" ?> 
<Settings>
  <ConnectionStrings>
    <MyDb>foo</MyDb>
    <ChildDb>bar</ChildDb>
  </ConnectionStrings>
</Settings>

要绑定到的选项类:

class ConnectionStringOptions
{
    public string MyDb { get; set; }
    public string ChildDb { get; set; }
}

以下将创建配置并将其绑定到选项。服务提供者用于获取选项的第二部分通常使用依赖注入自动完成,但这不是必需的。

var configurationBuilder = new ConfigurationBuilder()
    // TODO: Add more XML files based on the search and layering rules.
    .AddXmlFile("appSettings.xml");
var configuration = configurationBuilder.Build();

var services = new ServiceCollection()
    .AddOptions()
    .Configure<ConnectionStringOptions>(configuration.GetSection("ConnectionStrings"));
var serviceProvider = services.BuildServiceProvider();

var options = serviceProvider.GetRequiredService<IOptions<ConnectionStringOptions>>();
var connectionStringOptions = options.Value;

要进行编译,您需要以下 NuGet 包:

  • Microsoft.Extensions.Configuration.Xml
  • Microsoft.Extensions.DependencyInjection
  • Microsoft.Extensions.Options.ConfigurationExtensions

推荐阅读