ASP.NET 3.5
Классы в нашем решении ссылались на ConfigurationManater.AppSettings [""], чтобы получить appSettings (из web.config).
Мы решили, что нас это не устраивает. Люди неправильно набирали appSetting имена ключей в коде (который прекрасно компилировался), и было неудобно отслеживать использование. И затем есть дублированные строки по всей базе кода, когда вы ссылаетесь на одни и те же настройки приложения повсюду.
Итак, мы решили, что только одному классу будет разрешено ссылаться на ConfigurationManager, а остальное решение будет ссылаться на этот класс, когда ему потребуется значение определенного appSetting. ConfigurationManater.AppSettings [""] был статическим, поэтому мы выставили набор статических свойств только для чтения из нашего единственного класса Settings.
public class Settings {
public static string Foo {
get {
return ConfigurationManager.AppSettings["Foo"];
}
}
}
Это работало довольно хорошо, пока нам не нужно было проверять настройки в наших тестах. Мы создали интерфейс для включения насмешек (была ли это какая-то ошибка?).
public interface ISettings {
string Foo {
get;
set;
}
}
public class Settings : ISettings {
public string Foo {
get {
return ConfigurationManager.AppSettings["Foo"];
}
}
}
И теперь мы внедряем экземпляр ISettings как зависимость от объектов, которые используют значения настроек (класс / интерфейс находятся в проекте, на который каждый может ссылаться без проблем).
В местах, где мы не можем внедрить существующий экземпляр (например, Global.asax), мы создаем новый экземпляр в статическое поле.
Учитывая все это, что бы вы порекомендовали нам изменить и почему?