Я бы, вероятно, создал общий класс конфигурации, и каждый модуль зависел бы от одного или нескольких конкретных классов конфигурации, которые являются синглетонами. Модуль зависит от экземпляра класса конфигурации с настройками, которые важны только для этого модуля, и, необязательно, от одного или нескольких других экземпляров класса конфигурации с настройками, которые относятся к более чем одному модулю. В связи с тем, что объекты конфигурации являются единичными, модули, которые совместно используют объекты конфигурации, автоматически получают одинаковые настройки.
Вы должны создавать классы конфигурации в соответствии с функциональностью, а не в соответствии с использованием модуля. Функциональные возможности, которые использует модуль, подразумевают, какие объекты конфигурации ему понадобятся.
Каждый модуль, который добавляется в приложение, добавляет все необходимые классы конфигурации в качестве зависимостей, другие классы конфигурации не добавляются. Объекты конфигурации singleton добавляют себя в список (или реестр, если хотите) таких объектов при запуске приложения. Само приложение не должно знать о деталях, достаточно просто загрузить и сохранить настройки из и в постоянное хранилище. OTOH может использовать ту же инфраструктуру, если это необходимо.
Как правило, я бы реализовал все с точки зрения интерфейсов и оставил бы механизм персистентности снаружи. Таким образом, позже вы будете свободны иметь конфигурации в INI-файлах, реестре или даже базе данных (что даст вам простой способ реализовать историю изменений конфигурации). Я обнаружил, что с тех пор, как начал программировать с использованием интерфейсов, а не иерархий классов, я не так уж сильно привязан к способам ведения дел.