Брр, почитал доку на гитхабе - какая-то муть сложная. Обычно DI используют в паре с интерфейсами или чем-то аналогичным. В этой же либе, как я понял, используется либо привзяка к имени аргумента (можно указать какой класс надо использовать для аргумента), либо он из тайп-хинтов достаёт эту привязку. Ну и можно наконфигурять и изменить это всё "снаружи". Без интерфейсов так себе решение, но вроде как работающее. Тот же Angular в JS работает аналогично - привязка идёт по имени аргумента, а не по интерфейсу, который нужен коду.