Прежде всего, в D. нет стандартной поддержки DI. Под стандартным я имею в виду - инфраструктура DI не является частью стандартной библиотеки D.Поэтому все зависит от вас, как вы это реализуете.Я только кратко просканировал проект Python Dependency Injector, о котором вы упомянули, и кроме некоторых специфических для Python вещей, я не вижу причин, почему хорошая DI-инфраструктура, реализованная в D, не может быть сделана таким же образом.Название «провайдера» напоминает мне о том, как работает Java SPI, и это то, что мы (я также являюсь разработчиком на Java) используем десятилетиями, и это доказывает, что это хороший подход.
Ваш вопрос сбивает с толкунемного потому, что переопределение имеет особое значение в D. По моему скромному мнению, пользователи вашей структуры DI должны иметь возможность подключать другого, но совместимого поставщика, если эти поставщики предоставляют объекты одного типа.(реализуйте некоторый интерфейс, который нужен вашему классу).
Я уже говорил выше, что в стандартной библиотеке нет стандартной структуры DI, но стоит сказать, что существуют структуры DI для D, выполненные другими членами Dсообщества.Одним из них является превосходный (Spring-like) каркас Poodinis: https://github.com/mbierlee/poodinis.Посмотрите и посмотрите, соответствует ли он вашим потребностям.