Если еще раз перефразировать, любую программу можно представить в виде графа зависимостей, где узлы - это функции, а дуги - вызовы функций. Идея DI состоит в том, что этот граф строится в рантайме, причем строится не из исходных функций, а из каррированных. Каррирование (Init)(Data) => Result идентично new MyService(Init) {def fun(Data): Result}