Использование значений AppSettings в других разделах Web.config

#asp.net

#asp.net

Вопрос:

Есть ли способ использовать определенные свойства AppSettings в любом из других разделов файла web.config?

Довольно неприятно записывать значение (например, адрес электронной почты) более чем в один раздел и обновлять его везде, где это происходит, всякий раз, когда вносятся изменения.

Ответ №1:

Вы можете использовать String.Format для создания своих данных и использовать {0} в файле конфигурации в соответствующих местах.
Предполагая, что у вас есть базовые средства получения ваших данных, это должно быть легко реализовать.

Например:

 <add key="Mail" value="kobi@example.com"/>
<add key="LinkFormat" value="[[Mail Us|mailto:{0}]]"/>
  

И затем (удалено из try / catch, проверка данных):

 public static string GetEmail()
{
    return ConfigurationManager.AppSettings["Mail"];
}

public static string GetEmailLinkformat()
{
    string format = ConfigurationManager.AppSettings["LinkFormat"];
    string mail = GetEmail();
    return String.Format(format, mail);
}
  

Комментарии:

1. Не могли бы вы, пожалуйста, опубликовать пример?

2. О, спасибо, Коби, отличный пример! 🙂 В любом случае, я думал о любом решении, которое не требует дополнительного кодирования… Но если альтернативы нет, это сработает, еще раз спасибо.

3. В конечном итоге добавление таких функций сэкономит время и уменьшит дублирование кода. Я не знаю встроенного способа сделать это, используя только файл конфигурации.

Ответ №2:

Если вы используете $ разделители в значениях AppSettings, их можно заменить ключевыми значениями, которые они представляют из AppSettings, например

 <add key="PrivacyPolicyURL" 
  value="$domain$/Default.aspx?siteid=$siteid$amp;amp;locid=$locid$amp;amp;tpid=$tpid$"
  />
  

использование следующей функции для выполнения замен;

 public static string GetAppSetting(string key)
{
    string keyValue = ConfigurationManager.AppSettings[key].ToString();

    foreach (System.Text.RegularExpressions.Match match in System.Text.RegularExpressions.Regex.Matches(keyValue, @"$[dD]*?$"))
    {
        try
        {
            string replaceWith = ConfigurationManager.AppSettings[match.Value.Replace("$", string.Empty)]  ?? string.Empty;
            keyValue = keyValue.Replace(match.Value, replaceWith);
        }
        catch
        {
            keyValue = keyValue.Replace(match.Value, string.Empty);
        }
    }

    return keyValue;
}
  

Итак, в этом примере вставляются AppSettings для домена, siteid, locid и tpid, чтобы создать что-то вроде; www.mywebsite.com/Default.aspx?siteid=1001amp;locid=1001amp;tpid=1001

Комментарии:

1. Это тоже хороший вариант, спасибо! Однако я был более сосредоточен, например, на использовании значения, объявленного в разделе AppSettings, в другом разделе, таком как раздел log4net. В любом случае, я предполагаю, что любой вариант потребует некоторого кодирования, не так ли?