Всем привет.
Есть "небольшой легаси проект на WinForms". Там есть небольшой полтергейст с настройками, которые Properties.Settings. В общем начали разбираться и делать рефакторинг с выносом контролов из основного проекта в библиотеки контролов.
У проги есть настройки которые она использует (сюрприз!). Контролы тоже читают и пишут (через формочку пользователи могут ставить галочки).
Чтобы разобраться с полтергейстом сделали абстракцию над Settings, интерфейс со всеми нужными полями в настройках и методами Save и тд.
public interface ISettingProvider
{
int MyInt { get; set; }
string MyString { get; set; }
void Save();
}
Соответственно в проекте есть класс для интерфейса которые через гетеры/сетеры использует настройки
public string MyString
{
get => Properties.Settings.Default.MyString;
set => Properties.Settings.Default.MyString = value;
}
В ТЕСТАХ моким интерфейс и смотрим был для запрос к настройкам.
mock.VerifyGet(...)
Как вы понимаете тк контролы могут читать настройки там и сям, в том числе и из проктов с контролами то настройки хотя и называются Properties.Settings.Default по сути являются разными классами и контролы пишут не в настройки основного проекта, а в настройки себя.
Обычно бы просто передали класс как параметр в конструктор, но это разные классы. Те главные проект знает что есть CL с конролами, но контролам совершенно не надо знать о главном проекте. Иначе получается перекрестная ссылка.
Классический способ побороть такую фигню - вынести нужный код в собственный проект. Библиотека ссылается на него. Главные ссылается на него. Библиотека не знает о главном.
Resharper подсказывает когда настройки больше никем не используются :)
Минусы в общем тоже понятны (если они вообще есть).
Я правильно мыслю?