angular - कंस्ट्रक्टर इंजेक्शन के बिना सेवा का उदाहरण प्राप्त करना




angular2-di angular2-injection (2)

मेरे पास बूटस्ट्रैप में परिभाषित @Injectable सेवा है। मैं कंस्ट्रक्टर इंजेक्शन का उपयोग किए बिना सेवा का उदाहरण प्राप्त करना चाहता हूं। मैंने ReflectiveInjector.resolveAndCreate का उपयोग करने की कोशिश की, लेकिन यह एक नया उदाहरण बनाता है।

जिस कारण से मैं करने की कोशिश कर रहा हूं वह है मेरे पास कई घटकों द्वारा प्राप्त एक आधार घटक है। अब मुझे एक सेवा का उपयोग करने की आवश्यकता है लेकिन मैं इसे ctor में नहीं जोड़ना चाहता क्योंकि मैं सभी व्युत्पन्न घटकों पर सेवा को इंजेक्ट नहीं करना चाहता।

TLDR: मुझे एक ServiceLocator.GetInstance<T>()

अद्यतन: RC5 + के लिए अद्यतन कोड +: घटकों में उपयोग के लिए इंजेक्टर इंस्टेंस का भंडारण


अद्यतन कोणीय में जहाँ ngModules का उपयोग किया जाता है, आप कोड में कहीं भी उपलब्ध एक चर बना सकते हैं:

export let AppInjector: Injector;

export class AppModule {
  constructor(private injector: Injector) {
    AppInjector = this.injector;
  }
}

एक अन्य दृष्टिकोण में एक कस्टम डेकोरेटर को परिभाषित करना शामिल होगा (निर्भरता इंजेक्शन के लिए मेटाडेटा सेट करने के लिए एक CustomInjectable :

export function CustomComponent(annotation: any) {
  return function (target: Function) {

    // DI configuration
    var parentTarget = Object.getPrototypeOf(target.prototype).constructor;
    var parentAnnotations = Reflect.getMetadata('design:paramtypes', parentTarget);

    Reflect.defineMetadata('design:paramtypes', parentAnnotations, target);

    // Component annotations / metadata
    var annotations = Reflect.getOwnMetadata('annotations', target);
    annotations = annotations || [];
    annotations.push(annotation);
    Reflect.defineMetadata('annotations', annotations, target);
  }
}

यह अपने स्वयं के बजाय मूल निर्माणकर्ता से मेटाडेटा का लाभ उठाएगा। आप इसे बच्चे की कक्षा में उपयोग कर सकते हैं:

@Injectable()
export class SomeService {
  constructor(protected http:Http) {
  }
}

@Component()
export class BaseComponent {
  constructor(private service:SomeService) {
  }
}

@CustomComponent({
  (...)
})
export class TestComponent extends BaseComponent {
  constructor() {
    super(arguments);
  }

  test() {
    console.log('http = '+this.http);
  }
}

अधिक विवरण के लिए यह प्रश्न देखें:







angular2-injection