c# - 在没有 DI 的控制台应用程序中将 IConfigurationSection 与可刷新配置绑定(bind)

标签 c# .net-core .net-standard

我在 .Net Core 控制台应用程序中使类型化配置可刷新时遇到问题。

应用程序将从配置中加载类型化对象...

{
     "LibrarySettings": {
       "SettingA": "ValueA",
       "SettingB": "ValueB"
     }
}

... 并将它们作为 IOption<SomeLibrarySettings> 传递给图书馆

public class LibrarySettings
{
    public string SettingA { get; set; }
    public string SettingB { get; set; }
}

public class BusinessLogic
{
    private IOptions<LibrarySettings> _settings;

    public BusinessLogic(IOptions<LibrarySettings> settings)
    {
        _settings = settings;
    }

    public string GetValueA => _settings.Value.SettingA;

    public string GetValueB => _settings.Value.SettingB;
}

在运行时,如果我改变 appsettings.json我会期待底层 IOptions相应地更新值的实例。

public class Program
{
    static void Main(string[] args)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", false, true);

        var configuration = builder.Build();

        LibrarySettings settings = new LibrarySettings();

        configuration.Bind("LibrarySettings", settings);

        BusinessLogic logic = new BusinessLogic(Options.Create(settings));

        while (true)
        {
            configuration.Reload();
            Console.WriteLine();
            Console.WriteLine(logic.GetValueA);
            Console.WriteLine(logic.GetValueB);
            Console.ReadLine();
        }
    }
}

不幸的是,情况并非如此。当我启动此代码并更改复制的值时 appsettings.json应用程序中的值不会重新加载。

我做错了什么?

最佳答案

使用IOptionsSnapshot代替IOptions

public class BusinessLogic
{
     private IOptionsSnapshot<LibrarySettings> _settings;

     public BusinessLogic(IOptionsSnapshot<LibrarySettings> settings)
     {
         _settings = settings;
     }

     public string GetValueA => _settings.Value.SettingA;

     public string GetValueB => _settings.Value.SettingB;
 }

引用 Options patterns in ASP.NET Core

编辑:为避免常见错误('T' 必须是具有公共(public)无参数构造函数的非抽象类型)

public class LibrarySettings
{
    public string SettingA { get; set; }
    public string SettingB { get; set; }
    public LibrarySettings() {}
}

开始工作了:

class Program
    {

        static void Main(string[] args)
        {
            var builder = new ConfigurationBuilder()
                    .SetBasePath(Directory.GetCurrentDirectory())
                    .AddJsonFile("appsettings.json", false, true);

            var configuration = builder.Build();

            var settings = new LibrarySettings();

            configuration.GetSection("LibrarySettings").Bind(settings);

            var x = settings.SettingA;
        }

    }

    public class BusinessLogic
    {
        private LibrarySettings _settings;

        public BusinessLogic(IOptionsSnapshot<LibrarySettings> settings)
        {
            _settings = settings.Value;
        }

        public string GetValueA => _settings.SettingA;

        public string GetValueB => _settings.SettingB;
    }
    public class LibrarySettings
    {
        public string SettingA { get; set; }
        public string SettingB { get; set; }
        public LibrarySettings() { }
    }

关于c# - 在没有 DI 的控制台应用程序中将 IConfigurationSection 与可刷新配置绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53053322/

相关文章:

xamarin - Android 项目引用的 netstandard 项目中未命中断点

.net - 绑定(bind)重定向的框架配置在哪里?

c# - var 和 Class 类在对象创建上的区别

c# - Asp.net 初学者

linux - 将 .Net Core 1.0 升级到 2.0 Ubuntu 16.10

c# - 如何更新 .NET Core 和 .NET Framework 应用程序之间共享的程序集

c# - WCF - 使用 SoapUI 测试时出现 SOAP 操作不匹配错误

c# - 为 Access mdb 文件创建 OdbcConnection 的 ConnectionString 是什么

c# - ASP.NET Core 发布和启动设置

c# - .NET Core/.NET Standard 2.0 中的 ReliableSession/MaxRetryCount