У меня есть большая кодовая база с большим количеством «анти-шаблонных» синглетонов, служебных классов со статическими методами и классов, создающих свои собственные зависимости с помощью new
ключевого слова. Это делает код очень сложным для тестирования.
Я хочу постепенно перенести код в контейнер внедрения зависимостей (в моем случае это Guice
потому, что это GWT
проект). Из моего понимания внедрения зависимости это все или ничего. Либо все классы управляются Spring / Guice, либо нет. Поскольку кодовая база велика, я не могу преобразовать код за ночь. Поэтому мне нужен способ сделать это постепенно.
Проблема состоит в том, что когда я начинаю с класса, который нужно внедрить в другие классы, я не могу использовать простой @Inject
в этих классах, потому что эти классы еще не управляются контейнером. Таким образом, это создает длинную цепочку до «верхних» классов, которые нигде не вводятся.
Единственный способ, который я вижу, - сделать Injector
контекст / application глобально доступным через одноэлементное время, чтобы другие классы могли получать из него управляемые bean-компоненты. Но это противоречит важной идее не раскрытия composition root
приложения.
Другой подход будет восходящим: начать с «высокоуровневых» классов, включить их в контейнер внедрения зависимостей и медленно перейти к «меньшим» классам. Но потом мне придется долго ждать, так как я могу тестировать те небольшие классы, которые все еще зависят от глобальных параметров / статики.
Каким был бы способ добиться такой постепенной миграции?
PS Вопрос постепенного подхода к внедрению зависимости похож в заголовке, но он не отвечает на мой вопрос.