ค้นหาเว็บไซต์

การฉีดพึ่งพา - คอนสตรัคเตอร์ 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]}]

บทความที่เกี่ยวข้อง