1. Ikhtisar
Dependency Injection (DI), disebut sebagai DI
, adalah设计原则
dalam pemrograman面向对象
yang digunakan untuk mengurangi sambungan antar kode. [Rekomendasi tutorial terkait: "tutorial sudut"]
class MailService { konstruktor(APIKEY) {} } kelas Pengirim Email { Layanan surat: Layanan Surat konstruktor() { this.mailService = Layanan Mail baru("APIKEY1234567890") } kirimMail(surat) { this.mailService.sendMail(mail) } } const emailSender = EmailSender baru() emailSender.sendMail(mail)
Kelas EmailSender menggunakan kelas MailService saat dijalankan. Kelas EmailSender bergantung pada kelas MailService, dan kelas MailService adalah ketergantungan dari kelas EmailSender.
Tingkat penggabungan metode penulisan di atas terlalu tinggi, dan kodenya tidak kuat. Jika kelas MailService mengubah cara parameter diteruskan, metode penulisan di kelas EmailSender juga akan berubah.
kelas Pengirim Email { Layanan surat: Layanan Surat konstruktor(mailService: MailService) { this.mailService = layanan mail; } } const mailService = Layanan Mail baru("APIKEY1234567890") const emailSender = new EmailSender(mailService)
Saat membuat instance kelas EmailSender, ia memasukkan dependensinya ke dalam kelas melalui parameter konstruktor konstruktor.
Injeksi ketergantungan mengurangi hubungan antar kode dan meningkatkan kemudahan pemeliharaan kode. Perubahan kode di kelas MailService tidak lagi memengaruhi kelas EmailSender.
2. Kerangka DI
Angular memiliki DI 框架
sendiri, yang隐藏
proses penerapan injeksi ketergantungan. Pengembang hanya perlu menggunakan kode yang sangat sederhana untuk menggunakan fungsi injeksi ketergantungan yang kompleks.
Ada empat konsep inti dalam kerangka DI Angular:
Dependency
: objek instance tempat komponen bergantung, objek instance layanan
Token
: memperoleh identitas objek instance layanan
Injector
: injektor, bertanggung jawab untuk创建维护
objek instance layanan kelas dan注入
ke dalam objek instance Layanan komponen (mengelola pembuatan dan akuisisi objek layanan).
Provider
: Konfigurasikan objek injektor, tentukan kelas layanan untuk membuat objek instance layanan dan dapatkan pengidentifikasi objek instance. (Penyedia: Penyedia)
Injektor Injektor bertanggung jawab untuk membuat objek instance kelas layanan dan memasukkan objek instance kelas layanan ke dalam komponen yang diperlukan.
Buat impor injektor
{ ReflectiveInjector } dari "@angular/core" //Kelas layanan kelas MailService {} //Buat injektor dan teruskan kelas layanan const injector = ReflectiveInjector.resolveAndCreate([MailService])
Dapatkan objek instance kelas layanan di injektor
const mailService = injector.get(MailService)
Objek instance layanan dalam mode tunggal, dan injektor ada di Setelah instance layanan dibuat, itu akan di-cache
const mailService1 = injector.get(MailService) const mailService2 = injector.get(MailService) console.log(mailService1 === mailService2) //
injektor yang benar-benar berbeda mengembalikan objek instance layanan yang berbeda
const injector = ReflectiveInjector.resolveAndCreate([MailService]) const childInjector = injector.resolveAndCreateChild([MailService]) const mailService1 = injector.get(MailService) const mailService2 = childInjector.get(MailService) console.log(mailService1 === mailService2) // Pencarian untuk
instance layanan palsu mirip dengan作用域链
fungsi. Jika level saat ini dapat ditemukan, gunakan level saat ini induk untuk mencari
const injector = ReflectiveInjector.resolveAndCreate([ MailService]) const childInjector = injector.resolveAndCreateChild([]) const mailService1 = injector.get(MailService) const mailService2 = childInjector.get(MailService) console.log(mailService1 === mailService2) // true
menentukan kelas layanan untuk membuat objek instance dan pengidentifikasi untuk mengakses objek instance layanan.
const injector = ReflectiveInjector.resolveAndCreate([ { sediakan: MailService, useClass: MailService } ])
Pengidentifikasi untuk mengakses objek dependen juga bisa berupa tipe string
const injector = ReflectiveInjector.resolveAndCreate([ { sediakan: "mail", useClass: MailService } ]) const mailService = injector.get("mail")
useValue
const injector = ReflectiveInjector.resolveAndCreate([ { berikan: "Konfigurasi", useValue: Objek.freeze({ APIKEY: "API1234567890", APISCRET: "500-400-300" }) } ]) const Config = injector.get("Config")
membuat hubungan longgar antara objek instance dan referensi eksternal. Objek eksternal memperoleh objek instance melalui pengidentifikasi perubahan, itu tidak akan mempengaruhi bagian luar.