【问题标题】:How do I get AppSettings as a constant value?如何获取 AppSettings 作为常量值?
【发布时间】:2018-05-04 07:30:58
【问题描述】:

拿下面的代码

Web.config:

<configuration>
  <appSettings>
    <add key="accesstoken:case1" value="00b8d5e4-a318-4f2d-bd5b-e7832861dbb6" />
  </appSettings>
</configuration>

Controller.cs:

public JsonResult GetSomething(string token = "")
{
    switch (token)
    {
        case System.Configuration.ConfigurationManager.AppSettings["accesstoken:case1"]:
           ...
        case ...:
    }
}

所以在这里我收到 case1 的错误,说需要一个常量值。我的印象是 AppSettings 是不变的。但是因为它是以这样的方式被访问的,所以我认为常量是不可能的。

但我真的很喜欢 switch/cases 而不是一堆 if/else,那么是否可以访问 AppSettings 以获得一个常量值?

【问题讨论】:

  • 文件中的常量并不意味着它也是代码中的常量。代码中的常量总是有一个关键字const。不一样。
  • @CodeNotFound 否,但如果 AppSettings 本身是常量,则不能有任何参数,因此为了通用性和清晰性,AppSettings 在代码中也应该是常量。我不能成为第一个想在开关/案例中使用 AppSettings 的人。
  • 我理解你的要求,但我担心做不到。 const 必须在编译时加入到代码中。在运行时从 AppSettings 读取时,您可以瞄准的大多数目标是 readonly,但 readonly 变量也不能用作 switch case。
  • 必须在编译时知道constappsettings 中的值来自“外部”文件,因此不是常量

标签: asp.net-mvc appsettings


【解决方案1】:

文件中的常量并不意味着它也是代码中的常量。代码中的常量总是有一个关键字const。它不一样。文件设置中配置的值可以在执行期间修改应用程序。执行过程中不能修改常量字段。

在没有一堆if-elseswitch-case 的情况下实现您需要做的事情的解决方案是在您的应用程序启动时加载一个包含所有键的字典(例如以accesstoken:* 开头)

public static Lazy<IDictionary<string, string>> AppSettingsAccessTokens = new Lazy<IDictionary<string, string>>(() =>
{
    return ConfigurationManager.AppSettings.AllKeys.Where(p => p.StartsWith("accesstoken:")).ToDictionary(p => p, p => ConfigurationManager.AppSettings[p]);
});

最后在你喜欢的GetSomething 方法中:

public JsonResult GetSomething(string token = "")
{
    var accessTokenSettingKey = AppSettingsAccessTokens.Value.Values.FirstOrDefault(p => p == token)?.Key;

    // ....
}

【讨论】:

  • 是的!但仍然使用开关/案例 - 我交换它们并将其用于开关和按键作为常量案例。
猜你喜欢
  • 1970-01-01
  • 2021-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-06
相关资源
最近更新 更多