angular कन्स्ट्रक्टर इंजेक्शन के बिना सेवा का आवेश प्राप्त करना




angular2-di angular2-injection (3)

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

export let AppInjector: Injector;

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

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

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

टीएलएलआर: मुझे एक सेवासूत्रकर्ता चाहिए। GetInstance ServiceLocator.GetInstance<T>()

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


हां, ReflectiveInjector.resolveAndCreate() एक नया और असंबद्ध इंजेक्टर उदाहरण बनाता है।

आप कोणीय Injector इन्सजेक्टर को इंजेक्ट कर सकते हैं और इसका उपयोग करके इच्छित आवेश प्राप्त कर सकते हैं

constructor(private injector:Injector) {
  injector.get(MyService);
}

आप कुछ वैश्विक वैरिएबल में Injector को भी स्टोर कर सकते हैं और उदाहरण के लिए उपलब्ध उदाहरणों को हासिल करने के लिए इस इंजेक्टर उदाहरण का इस्तेमाल करते हैं जैसे https://github.com/angular/angular/issues/4112#issuecomment/383811572


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

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