【问题标题】:Keyvaluepair value issue appsettings键值对值问题 appsettings
【发布时间】:2022-01-09 04:00:55
【问题描述】:

这是我的应用设置

  {
    "Messages": {
        "ApiUrl": "demo",   
        "ApiKey": {
          "Key": "key",
          "Value": "1234"
        }
    }
  }

模型类:

public class CPSSettings
{
    public Messages Messages { get; set; } = null!;  
}
public class Messages
{
    public string ApiUrl { get; set; } = null!;
    public KeyValuePair<string?, string?> ApiKey{ get; set; }
} 
       

我没有得到 _settings.Messages.ApiKey.Key 和 _settings.Messages.ApiKey.Value 的值

但收到ApiUrl 的值。我对 KeyValuePair 没有收到值有疑问

public testClient(IOptions<CPSSettings> options)
{  
    _settings = options.Value;
}

//...

if (_settings.Messages.ApiKey.Key is not null 
    && _settings.Messages.ApiKey.Value is not null)
{
    var s = _settings.Messages.ApiKey.Key;    // am getting null vaues in both
    var s1 = _settings.Messages.ApiKey.Value
}

【问题讨论】:

  • 您的代码看起来很混乱。你的设置文件有ApiKey;你的Messages 类有UserId;但访问它的代码有ApiKey。
  • 我看不到您在哪里定义和分配设置。可以发一下吗?
  • @RichardDeeming 抱歉我已经更新了..我在课堂上删除了一些代码...请检查更新的问题
  • @Ajt KeyValuePair 的成员是只读的。初始化结构后,框架无法设置这些值
  • @Ajt 使用您控制的另一种对象类型。有可修改的成员

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


【解决方案1】:

KeyValuePair 的成员是只读的。初始化结构后,框架无法设置这些值

我建议您使用您控制的其他对象类型。具有可修改成员的一种。

例如

public class CPSSettings {
    public Messages Messages { get; set; } = null!;  
}

public class Messages {
    public string ApiUrl { get; set; } = null!;
    public ApiKey ApiKey{ get; set; } //<-- NOTE THE CHANGE
} 

public class ApiKey {
    public string? Key { get; set; }
    public string? Value { get; set; }
}

这样,在绑定设置时,框架可以初始化并正确设置成员的值

【讨论】:

    【解决方案2】:

    删除CPSSettings 将简化场景。 请参阅下文,了解如何通过Options pattern in .NET 使用Messages 访问配置值:

    1. 确保您在Startup.ConfigureServices(...) 中注册了Messages(示例如下)。
    services.Configure<Messages>(Configuration.GetSection("Messages"));
    
    1. 接收IOptions&lt;Messages&gt; 作为testClient 构造函数参数(示例如下)。
    public testClient(IOptions<Messages> options)
    {
        _settings = options.Value;
    }
    

    【讨论】:

    • 我已经更新了问题...实际上 keyvaluepair 显示为空
    • @Ajt,我已更新答案以考虑其他问题详细信息。
    【解决方案3】:

    KeyValuePair 的成员是只读的。您可以使用它,但您必须进行一些转换。我不认为你真的需要它。所以我创建了另一个类来替换它。您还必须使用 Messages 类来反序列化设置。 CPSSettings 类是一个错误,您不需要它。所以试试这段代码,它是在 Visual Studio 中测试的。

    var cpsSettingsSection = configuration.GetSection("Messages");
    var cpsSettings = cpsSettingsSection.Get<Messages>();
    
    var url = cpsSettings.ApiUrl;
    var key = cpsSettings.ApiKey.Key.Dump();    
    var value = cpsSettings.ApiKey.Value.Dump();
    
    //services.Configure<Messages>(cpsSettingsSection);
    
    public class Messages
    {
        public string ApiUrl { get; set; }
        public KeyValueString ApiKey {get; set;}
     }
    
    public class KeyValueString
    {
        public string Key { get; set; }
        public string Value { get; set; }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-06-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-03
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 2018-06-07
      相关资源
      最近更新 更多