【问题标题】:How can I bind to a configuration class using ConfigurationBulder in .net core 3.1如何在 .net core 3.1 中使用 ConfigurationBulder 绑定到配置类
【发布时间】:2019-12-21 21:57:05
【问题描述】:

我想使用ConfigurationBuidler 来读取我的appsettings.json 文件。我看不出我做错了什么。

我的文件是

{
  "comment": "this gets copied to bin\\debug on build. the app updates the copy. However to remember the settings you need to paste them here",
  "col1Width": "344"
}

我的测试失败了

[TestMethod]
public void TestMethod1()
{
    var configuration = Helper.LoadConfiguration("appsettings.json");
    Assert.IsTrue(configuration.Properties.Keys.Contains("col1Width")); // fails here
}

我的助手类是

public static  class Helper
{
    public static ConfigurationBuilder LoadConfiguration(string filename)
    {
        var configuration = new ConfigurationBuilder();
        var currentDirectory = System.IO.Directory.GetCurrentDirectory();
        configuration.SetBasePath(currentDirectory);
        configuration.AddJsonFile(path: filename, optional: false, reloadOnChange: true);
        configuration.Build();
        return configuration;
    }
}

[更新]

我根据 Marco 指出的博客文章更正了问题标题并更新了代码如下。

只有.Bind不可用

public static  class Helper
{
    public static FeedReadConfiguration GetApplicationConfiguration( )
    {
        var configuration = new FeedReadConfiguration();
        var currentDirectory = System.IO.Directory.GetCurrentDirectory();

        var iConfig = GetIConfigurationRoot(currentDirectory);

        iConfig
            .GetSection("FeedRead")
            .Bind(configuration); // Not available

        return configuration;
    }

    public static IConfigurationRoot GetIConfigurationRoot(string outputPath)
    {
        return new ConfigurationBuilder()
            .SetBasePath(outputPath)
            .AddJsonFile("appsettings.json")
            .Build();
    }

}
public class FeedReadConfiguration
{
    public int Col1Width { get; set; }
}

【问题讨论】:

  • 旁边的问题:你为什么返回ConfigurationBuilder而不是内置的IConfiguration
  • 我认为你的 appSettings.json 文件没有放在你的测试项目中。放置实际项目中的应用设置文件以测试项目。
  • 克尔斯滕,这可能对你有帮助:weblog.west-wind.com/posts/2018/Feb/18/…
  • 测试是否失败(断言?)或者是否有异常抛出并带有详细的异常消息。 F.e.找不到文件,原因是:optional: false?
  • 谢谢@Martin 我更新了问题以表明它是失败的断言。我也在重写以使用 IConfiguration。

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


【解决方案1】:

根据显示的设置文件,没有"FeedRead" 部分

需要直接从根目录读取设置。

using Microsoft.Extensions.Configuration;

public static class Helper {
    public static FeedReadConfiguration GetApplicationConfiguration( ) {
        
        var currentDirectory = System.IO.Directory.GetCurrentDirectory();

        var iConfig = GetIConfigurationRoot(currentDirectory);

        //Microsoft.Extensions.Configuration.Binder.dll
        FeedReadConfiguration configuration = iConfig.Get<FeedReadConfiguration>();

        return configuration;
    }

    public static IConfiguration GetIConfigurationRoot(string outputPath) {
        return new ConfigurationBuilder()
            .SetBasePath(outputPath)
            .AddJsonFile("appsettings.json")
            .Build();
    }    
}

(需要Microsoft.Extensions.Configuration.BinderMicrosoft.Extensions.Configuration.Json

参考Configuration in ASP.NET Core

参考Options pattern in ASP.NET Core

【讨论】:

  • IConfigurationRoot 没有 get 方法。它有 GetChildren,但对绑定没有用。
  • @KirstenGreed 扩展方法。确保你有必要的参考资料。
  • @KirstenGreed winforms 如何在这里发挥作用?
  • @KirstenGreed plus配置模块独立于asp.net,所以可以在asp.net环境之外使用。
猜你喜欢
  • 2020-08-20
  • 2020-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多