В вашем примере нет внедрения зависимостей.
Внедрение зависимостей буквально означает: вы внедряете зависимость в класс, вы не создаете ее сами и не активно попросите другой компонент для этой зависимости.
В вашем примере нет класса, который действительно имел бы зависимость (кроме, конечно, Program
).
В вашем методе Main
Program.cs
является композицией root. Здесь вы подключаете контейнер DI («поставщик услуг»). Конечно, вам нужно будет изменить его, когда вы захотите изменить реализации.
Теперь представьте, что у вас есть класс, который имеет зависимость IMessage
:
class ChatBot
{
private readonly IMessage message;
public ChatBot(IMessage message) => _message = message;
public void Greet() => _message.PrintMessage("Hello World!");
}
Если вы замените реализацию IMessage
в составе root, класс ChatBot
даже не узнает об этом. Вам не нужно трогать этот класс.
Представьте, что у вас есть 50 классов, которые все используют IMessage
для печати сообщений. Изменение реализации по-прежнему вызывает изменение состава root, , но только там . Другие 50 классов не нужно менять.
Это также поможет вам в модульном тестировании. Если вы хотите проверить класс ChatBot
, вы можете смоделировать зависимость IMessage
так, как вам нужно. У вас также есть прямое знание, что ChatBot
класс нуждается в и IMessage
и ничего кроме этого. Ваш код может быть проверен (никаких скрытых вызовов неизвестным одиночным, статусам c классы и т. Д. c.)
Надеюсь, мое объяснение поможет. Вы можете прочитать большую книгу «Внедрение зависимостей в. NET», где вы найдете много хороших идей о разработке поддерживаемого программного обеспечения. NET.