【问题标题】:Options Configuration with dynamic (runtime) values具有动态(运行时)值的选项配置
【发布时间】:2019-09-03 07:31:31
【问题描述】:

我有一个 MySettings 类,我想将其配置为 Options 以通过依赖注入使其可用。

目前我这样做(在服务构建器扩展方法中):

services.Configure<MySettings>(configuration.GetSection(MySettings.CustomSectionName));

我的问题是一部分设置来自 appsettings,而其他值仅在运行时(启动)时才知道。

所以我尝试找出如何通过添加运行时提供的值来配置设置。我试图将值添加到配置中

configuration["SectionName:ValueX"] = "my runtime value";

不起作用和valuex始终为null(当在控制器中注入选项时)。

对我有什么建议吗?

【问题讨论】:

  • 您不一定需要使用Options。如果我做对了,您可以将该部分绑定到您的类,获取它的一个实例,添加更多配置,然后在 DI 容器中自己将其注册为单例。您能否更好地解释这些其他“运行时”值是如何获得的?
  • 好吧,该值只是一个硬编码的名称(在多个地方使用),不应在代码之外更改(也就是通过配置)。取什么值取决于库的用户(在 Startup.ConfigureServices 中)。我更喜欢程序集名称、guid 或硬编码字符串。
  • 啊,我明白了。所以你有你的配置,但是消费者可以添加更多的东西,你想以某种方式将它们合并在一起?
  • 嗯,是的。现在我有服务构建器扩展方法(用于添加服务),它将 ValueX 作为字符串,验证它,如果它无效则抛出异常。我只是没有将这个值放入配置中(在扩展方法中),所以它是在控制器注入选项时设置的。

标签: asp.net-core .net-core asp.net-core-mvc


【解决方案1】:

你可以尝试注册MySettings 而不是IOptions&lt;MySettings&gt;

public void ConfigureServices(IServiceCollection services)
{          
    var mySettings = new MySettings();
    Configuration.Bind("MySettings", mySettings);
    mySettings.Title = "Hello";
    services.AddSingleton(mySettings);
}

并使用MySettings 喜欢

public class HomeController : Controller
{
    private readonly MySettings _settings;
    public HomeController(MySettings settings)
    {
        _settings = settings;
    }
    public IActionResult Index()
    {
        return Ok(_settings);
    }

【讨论】:

    猜你喜欢
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 2021-03-17
    • 2023-01-01
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    相关资源
    最近更新 更多