
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")устанавливает слабую связь между объектом экземпляра и внешней ссылкой. Внешний объект получает объект экземпляра через идентификатор, пока идентификатор остается неизменным, независимо от того, как работает внутренний код. изменения, это не повлияет на внешний вид.