Как мне получить AppSettings как постоянное значение? - PullRequest
0 голосов
/ 04 мая 2018

Возьмите код ниже

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 / case вместо множества if / elses, поэтому можно ли получить доступ к AppSettings для получения постоянного значения?

1 Ответ

0 голосов
/ 04 мая 2018

Константа внутри файла не означает, что она также является константой в коде. Константа в коде всегда имеет ключевое слово const. Это не одно и то же. Значения, настроенные в настройках файла, могут быть изменены во время выполнения вашего Приложение. Постоянные поля не могут быть изменены во время выполнения.

Решение для достижения того, что вам нужно сделать без набора if-else или switch-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;

    // ....
}
...