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