【问题标题】:Settings hierarchy in .net core.net core 中的设置层次结构
【发布时间】:2020-11-17 13:38:59
【问题描述】:

我希望混合使用 .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;

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

【问题讨论】:

  • 您要使用“旧”.config (xml) 还是“新”.json 配置?
  • @MatteoUmili,目前是 xml,但未来是 JSON。
  • 我认为使用经典的 xml 无法完全实现您想要的,但是使用 json 配置很容易实现

标签: c# .net-core configuration app-config


【解决方案1】:

不幸的是,这似乎不受支持。

我唯一能想到的是将通用设置保存在common.settings 中并创建自定义构建过程以将该文件复制到其他项目的根目录。另见this

我正在开发企业软件,而不是我们为此使用一个简单的 xml 文件。然后我们有一个在代码中反映这个文件的类。我们在这里定义我们的价值观。启动时,文件被写入 MyApp/bin/debug/settings,应用程序将大部分设置移动到数据库中。当用户更改文件时,将再次根据数据库检查文件。

【讨论】:

    【解决方案2】:

    您的标题表明您要Microsoft.Extensions.Configuration 进行配置。这也可以用于完整的框架项目,也可以用于supports XML

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

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

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

    这里是一个配置文件:

    <?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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-31
      • 2016-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-19
      相关资源
      最近更新 更多