Есть два основных подхода к этому, о которых я знаю:
a) Используйте IoC и зависимость конструктора для передачи вашего общего объекта.Как вы упоминали, если этот объект используется во многих, многих местах, это загрязняет интерфейс и во многих случаях добавляет много беспорядка.
b) Использование окружающего контекста : создание интерфейса на основеsingleton, к которому могут обращаться классы, которым нужен экземпляр объекта.В синглтоне есть установщик, позволяющий переопределить экземпляр (например, для модульного тестирования), поэтому тестирование кода все еще возможно.