1 ภาพรวม
Dependency Injection (DI) เรียกว่า DI
เป็น设计原则
ในการเขียนโปรแกรม面向对象
ที่ใช้เพื่อลด การเชื่อมต่อ ระหว่างโค้ด [คำแนะนำการกวดวิชาที่เกี่ยวข้อง: "กวดวิชาเชิงมุม"]
MailService คลาส { ตัวสร้าง (APIKEY) {} - คลาส EmailSender { บริการเมล: MailService ตัวสร้าง () { 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: MailService) { this.mailService = บริการเมล; - - const mailService = MailService ใหม่ ("APIKEY1234567890") const emailSender = new EmailSender(mailService)
เมื่อสร้างอินสแตนซ์คลาส EmailSender คลาสจะแทรกการขึ้นต่อกันลงในคลาสผ่านพารามิเตอร์ Constructor Constructor
การพึ่งพาการฉีดช่วยลดการเชื่อมต่อระหว่างโค้ดและเพิ่มการบำรุงรักษาโค้ด การเปลี่ยนแปลงรหัสในคลาส MailService จะไม่ส่งผลกระทบต่อคลาส EmailSender อีกต่อไป
2. กรอบงาน DI
Angular มี DI 框架
ของตัวเอง ซึ่ง隐藏
กระบวนการของการนำการพึ่งพาการฉีดไปใช้ นักพัฒนาจำเป็นต้องใช้โค้ดง่ายๆ เท่านั้นเพื่อใช้ฟังก์ชันการขึ้นต่อกันที่ซับซ้อน
มีแนวคิดหลักสี่ประการในกรอบงาน DI ของ Angular:
Dependency
: วัตถุอินสแตนซ์ที่ส่วนประกอบขึ้นอยู่กับ, วัตถุอินสแตนซ์บริการ
Token
: รับข้อมูลประจำตัวของวัตถุอินสแตนซ์บริการ
Injector
: หัวฉีด รับผิดชอบใน创建维护
วัตถุอินสแตนซ์ของบริการ และ注入
เข้าไปในออบเจ็กต์อินสแตนซ์บริการของคอมโพเนนต์ (จัดการการสร้างและการได้มาของออบเจ็กต์บริการ)
Provider
: กำหนดค่าออบเจ็กต์ของหัวฉีด ระบุคลาสบริการเพื่อสร้างออบเจ็กต์อินสแตนซ์บริการ และรับตัวระบุของออบเจ็กต์อินสแตนซ์ (ผู้ให้บริการ: ผู้ให้บริการ)
หัวฉีด หัวฉีดมีหน้าที่รับผิดชอบในการสร้างออบเจ็กต์อินสแตนซ์คลาสบริการและการฉีดออบเจ็กต์อินสแตนซ์คลาสบริการลงในส่วนประกอบที่จำเป็น
สร้าง
การนำเข้าหัวฉีด {สะท้อนแสงInjector } จาก "@เชิงมุม/แกน" //บริการคลาสคลาส MailService {} // สร้างหัวฉีดและส่งผ่านในคลาสบริการ const injector =สะท้อนแสงInjector.resolveAndCreate([MailService])
รับวัตถุอินสแตนซ์คลาสบริการในหัวฉีด
const mailService = injector.get(MailService)
วัตถุอินสแตนซ์บริการอยู่ในโหมดซิงเกิลตัน และ injector อยู่ใน หลังจากสร้างอินสแตนซ์บริการแล้ว มันจะถูกแคชไว้
const mailService1 = injector.get(MailService) const mailService2 = injector.get (MailService) console.log(mailService1 === mailService2) // true
ที่แตกต่างกัน injectors ส่งคืนวัตถุอินสแตนซ์บริการที่แตกต่างกัน
const injector =สะท้อนแสงInjector.resolveAndCreate([MailService]) const childInjector = injector.resolveAndCreateChild ([MailService]) const mailService1 = injector.get (MailService) const mailService2 = childInjector.get (MailService) console.log(mailService1 === mailService2) // การค้นหา
อินสแตนซ์บริการที่ผิดพลาดจะคล้ายกับ作用域链
ของฟังก์ชัน หากพบระดับปัจจุบัน ให้ใช้ระดับปัจจุบัน หากไม่พบระดับปัจจุบัน ให้ไปที่ parent เพื่อค้นหา
const injector =สะท้อนแสงInjector.resolveAndCreate([ MailService]) const childInjector = injector.resolveAndCreateChild ([]) const mailService1 = injector.get (MailService) const mailService2 = childInjector.get (MailService) console.log(mailService1 === mailService2) // true
อบเจ็กต์หัวฉีดการกำหนดค่าของผู้ให้บริการระบุคลาสบริการเพื่อสร้างออบเจ็กต์อินสแตนซ์และตัวระบุเพื่อเข้าถึงออบเจ็กต์อินสแตนซ์บริการ
const injector =สะท้อนแสงInjector.resolveAndCreate([ { ให้: MailService, useClass: MailService } ])
ตัวระบุสำหรับการเข้าถึงอ็อบเจ็กต์ที่ต้องพึ่งพาอาจเป็นประเภทสตริง
const injector =สะท้อนแสงInjector.resolveAndCreate([ { ให้: "เมล", useClass: MailService } - const mailService = injector.get ("เมล")
useValue
const injector =สะท้อนแสงInjector.resolveAndCreate ([ - ให้: "กำหนดค่า", useValue: Object.freeze({ APIKEY: "API1234567890", APISCRET: "500-400-300" - - - const Config = injector.get("Config")
สร้างความสัมพันธ์แบบหลวมๆ ระหว่างอ็อบเจ็กต์อินสแตนซ์และการอ้างอิงภายนอก อ็อบเจ็กต์ภายนอกได้รับอ็อบเจ็กต์อินสแตนซ์ผ่านตัวระบุ ตราบใดที่ตัวระบุยังคงไม่เปลี่ยนแปลง ไม่ว่าโค้ดภายในจะเป็นอย่างไร การเปลี่ยนแปลงก็จะไม่ส่งผลกระทบต่อภายนอก