1. Обзор
Внедрение зависимостей (DI), называемое DI
, — это设计原则
в面向对象
программировании, который используется для уменьшения связи между кодами. [Рекомендация по соответствующему учебнику: «учебник по Angular»]
class MailService { конструктор(APIKEY) {} } класс EmailSender { Почтовая служба: Почтовая служба конструктор() { this.mailService = новый MailService("APIKEY1234567890") } sendMail (почта) { this.mailService.sendMail(почта) } } const emailSender = новый EmailSender() emailSender.sendMail(mail)
Класс EmailSender при работе использует класс MailService. Класс EmailSender зависит от класса MailService, а класс MailService является зависимостью класса EmailSender.
Степень связи описанного выше метода записи слишком высока, и код не является надежным. Если класс MailService изменит способ передачи параметров, метод записи в классе EmailSender также изменится.
класс EmailSender { Почтовая служба: Почтовая служба конструктор (mailService: MailService) { this.mailService = mailService; } } const mailService = новый MailService("APIKEY1234567890") const emailSender = new EmailSender(mailService)
При создании экземпляра класса EmailSender он внедряет свои зависимости в класс через параметры конструктора. Этот способ записи представляет собой внедрение зависимостей.
Внедрение зависимостей уменьшает связь между кодами и повышает удобство сопровождения кода. Изменения кода в классе MailService больше не влияют на класс EmailSender.
2. Фреймворк DI
Angular имеет собственный DI 框架
, который隐藏
процесс внедрения внедрения зависимостей. Разработчикам достаточно использовать очень простой код для использования сложных функций внедрения зависимостей.
В структуре Angular DI существует четыре основных понятия:
Dependency
: объект экземпляра, от которого зависит компонент, объект экземпляра службы.
Token
: получает идентификатор объекта экземпляра службы.
Injector
: инжектор, ответственный за创建维护
объекта экземпляра службы. class и注入
в объект экземпляра компонента Service (управляет созданием и получением объектов службы).
Provider
: настройте объект инжектора, укажите класс обслуживания для создания объекта экземпляра службы и получите идентификатор объекта экземпляра. (Поставщик: Поставщик)
Инжекторы отвечают за создание объектов экземпляра класса обслуживания и внедрение объектов экземпляра класса обслуживания в необходимые компоненты.
Создайте импорт инжектора
{ ReflectiveInjector } из "@angular/core" //Класс обслуживания class MailService {} //Создаем инжектор и передаем класс сервиса const injector = ReflectiveInjector.resolveAndCreate([MailService])
Получаем объект экземпляра класса сервиса в инжекторе
const mailService = injector.get(MailService)
Объект экземпляра сервиса находится в одноэлементном режиме и инжектор находится в режиме После создания экземпляра службы он будет кэширован
const mailService1 = injector.get(MailService) const mailService2 = инжектор.get(MailService) console.log(mailService1 === mailService2) // true
разные инжекторы возвращают разные объекты экземпляра службы
const injector = ReflectiveInjector.resolveAndCreate([MailService]) const childInjector = injector.resolveAndCreateChild([MailService]) const mailService1 = инжектор.get(MailService) const mailService2 = childInjector.get(MailService) console.log(mailService1 === mailService2) // Поиск ложных
экземпляров сервиса аналогичен作用域链
функции. Если текущий уровень найден, используйте текущий уровень. Если текущий уровень не найден, перейдите к. родительский элемент для поиска
const injector = ReflectiveInjector.resolveAndCreate([ MailService]) const childInjector = injector.resolveAndCreateChild([]) const mailService1 = инжектор.get(MailService) const mailService2 = childInjector.get(MailService) console.log(mailService1 === mailService2) // true
указывает класс службы для создания объекта экземпляра и идентификатор для доступа к объекту экземпляра службы.
const инжектор = ReflectiveInjector.resolveAndCreate([ {предоставить: MailService, useClass: MailService} ])
Идентификатором для доступа к зависимому объекту также может быть строковый тип
const injector = ReflectiveInjector.resolveAndCreate([ {обеспечьте: "почта", useClass: MailService} ]) const mailService = injector.get("mail")
useValue
const injector = ReflectiveInjector.resolveAndCreate([ { укажите: «Конфигурация», useValue: Object.freeze({ APIKEY: "API1234567890", АПИСКРЕТ: «500-400-300» }) } ]) const Config = injector.get("Config")
устанавливает слабую связь между объектом экземпляра и внешней ссылкой. Внешний объект получает объект экземпляра через идентификатор, пока идентификатор остается неизменным, независимо от того, как работает внутренний код. изменения, это не повлияет на внешний вид.