การฉีดพึ่งพา - คอนสตรัคเตอร์ DI พร้อมพารามิเตอร์ทางเลือก
ตัวคอนสตรัคเตอร์ของฉันมีพารามิเตอร์แบบเลือกได้และพวกมันดูเหมือนจะรบกวนวิธีหลักในการทำ DI
constructor(public name:string, public age?:number, private _service:Service);
Typescript เข้าใจได้ว่ามันไม่ชอบที่ฉันวางพารามิเตอร์ที่ไม่เป็นทางเลือกไว้หลังพารามิเตอร์ที่เป็นทางเลือก นอกจากนี้บริการก็จะไม่ถูกฉีดเข้ามาเมื่อพารามิเตอร์ที่เป็นทางเลือกไม่ได้ถูกตั้งค่า ฉันจะแก้ปัญหานี้อย่างไร? ฉันไม่สามารถวางมันที่อื่นใน constructor ได้เพราะจะถูกคาดหวังให้ตั้งค่าบริการด้วยตนเอง
มีอะไรแบบการฉีดฟิลด์ไหม?
@Inject() private _service:Service;
constructor(public name:string, public age?:number);
ฉันควรแทนที่พารามิเตอร์ตัวเลือกด้วยค่าพื้นฐานหรือไม่? มีข้อเสนอแนะอื่น ๆ ไหม?
แก้ไข: ดังที่ได้กล่าวถึงด้านล่าง ผมพยายามฉีดบริการลงในอ็อบเจ็กต์ที่ไม่ได้ถูกสร้างโดย DI ของ Angular ซึ่งวิธีนี้ใช้ไม่ได้ เนื่องจากผมไม่สามารถสร้างคลาสนี้ (โมเดล) โดยใช้ DI ได้ ตอนนี้ผมจึงส่งบริการนี้ด้วยตนเองจากคลาสที่สร้างอ็อบเจ็กต์เหล่านี้
คำตอบ #1
เพียงเพิ่มตัวตกแต่ง @Optional() ก่อนพารามิเตอร์ตัวสร้างที่ควรถูกฉีดเข้ามาเฉพาะเมื่อมีผู้ให้บริการถูกลงทะเบียนเท่านั้น
import { Optional } from '@angular/core';
constructor(public name:string, @Optional() public age:number)
คำตอบ #2
ถ้าผมเข้าใจถูกต้องในสิ่งที่คุณพยายามจะทำ คุณต้องการ factory สำหรับบริการ ดูที่นี่: https://angular.io/docs/ts/latest/guide/dependency-injection.html#factory-provider
โดยพื้นฐาน,
class MyClass {
constructor(public name:string, private _service:Service, public age?:number){}
}
แล้วก็
let myFactory = (_service: Service) => {
return isAgeOk ? new MyClass(name, _service, age) : new MyClass(name, _service);
};
และจากนั้นคุณควรให้บริการของคุณแบบนี้:
providers: [{ provide: MyClass, useFactory: MyFactory, deps: [Service]}]
