Прежде всего, это плохой вопрос для StackOverflow.Но это заслуживает ответа.Итак, вот оно.
Если вы не используете DI
Основное отличие состоит в том, что если вы не используете DI (внедрение зависимостей), тогда ваш код ДОЛЖЕНзнать, как создать все его зависимости.У вас есть тонны компонентов, использующих тонны услуг.Службы могут ретранслироваться на другие службы, например, TalksAppBackend
может потребоваться HttpClient
услуга.И ваш код должен создавать зависимости для своих зависимостей.Как и
TalksAppBackend t = new TalksAppBackend(new HttpClient())
И каждый ваш компонент должен это делать, создавая новый экземпляр TalksAppBackend и экземпляр HttpClient.И если позже TalksAppBackend
потребуется некоторая служба ведения журналов, вы должны вручную обновить все ваши компоненты, чтобы создать все декы для TalksAppBackend
.Такой код трудно поддерживать, и он использует больше памяти, чем следовало бы, потому что он не разделяет экземпляры.
Если вы используете DI
Вы просто указываете модуль иликомпонент, который отвечает за создание экземпляра желаемой зависимости.Это позаботится и о его зависимостях.Ваши компоненты могут просто указать желаемый класс TalksAppBackend
для инъекции и не должны заботиться о том, требует ли он HttpClient
или Logger
или что-то еще.DI делает эту работу.И у вас есть прекрасный контроль над этим: глобальная служба, предоставляемая модулем, будет создана только один раз.Таким образом, ваши компоненты могут использовать один и тот же экземпляр.И если вы хотите, вы можете предоставить его на уровне компонентов, чтобы можно было создать много экземпляров, и дочерние компоненты будут иметь доступ к единственному необходимому экземпляру.
И этот подход также открывает путь для насмешки.зависимости и предоставляют не реальную TalksAppBackend
услугу, а скорее имитацию с поддельными ответами, которая не требует сетевого взаимодействия и запуска бэкэнда, чтобы проверить, правильно ли ваш компонент интерпретирует результаты.И вы можете сделать это без изменения кода вашего компонента.Таким образом, в этом подходе компонент ориентирован на то, что он должен делать ТОЛЬКО.