c# - 在没有 DI 的控制台应用程序中将 IConfigurationSection 与可刷新配置绑定
问题描述
我在 .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
insted ofIOptions
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;
}
编辑:避免常见错误('T' must be a non-abstract type with a public parameterless constructor
)
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() { }
}
推荐阅读
- amazon-web-services - AWS Glue 爬虫未出现在 Athena 中
- c# - 对静态列表的只读访问
在没有锁的大规模并行代码中 - javascript - Native TextInput 比 JS 领先 7 个事件 - 尝试让你的 JS 更快
- azure - 如何创建允许用户向 Key Vault 添加访问策略的自定义 Azure 角色?
- django - 在 FactoryBoy 中,如何在我的工厂中设置多对多字段?
- sql - 用于指示没有销售的行的 SQL
- python - 如何使用字符串索引字符串值将 pandas DataFrame 转换为 dict?
- php - 如何以编程方式调用 Elementor 全局小部件并将其传递值以填充字段
- ios - 如何从Swift5中的最后一个索引开始获取特定字符之前的所有字符?
- php - 递归遍历 PHP 中 10000 个元素的数组:达到最大函数嵌套级别