2016-05-09 20 views
6

Birbirinin özelliklerine ve/veya yöntemlerine erişmek için 2 hizmete ihtiyacım olan gerçek bir projede gerçek bir senaryo var. Ben Açısal bir uzman değilim, bu mümkün mü?Başka bir servisin içinde bir servis enjekte etmek mümkün mü?

Denedim ve başarısız.

import { Injectable } from '@angular/core'; 
import { FirstService } from './first.service'; 

@Injectable() 
export class SecondService { 

    bar: string = 'xyz'; 

    constructor(public firstService: FirstService) { 
    this.bar = this.bar + this.firstService.foo; 
    } 

} 

Plunker

app.component.ts

import { Component } from '@angular/core'; 
import { FirstService } from './first.service'; 
import { SecondService } from './second.service'; 

@Component({ 
    selector: 'my-app', 
    template: '<h1>Hello world!</h1>', 
    providers: [FirstService, SecondService] 
}) 
export class AppComponent { 

    constructor(public firstService: FirstService, public secondService: SecondService) { 
    console.log(firstService.foo); 
    console.log(secondService.bar); 
    } 

} 

first.service.ts

import { Injectable } from '@angular/core'; 
import { SecondService } from './second.service'; 

@Injectable() 
export class FirstService { 

    foo: string = 'abc'; 

    constructor(public secondService: SecondService) { 
    this.foo = this.foo + this.secondService.bar; 
    } 

} 

second.service.ts: İşte benim girişimi var http://plnkr.co/edit/PQ7Uw1WHpvzPRf6yyLFd?p=preview

Sadece İkinci hizmetin ilk hizmete enjekte edilmesi iyi çalışıyor ancak ilk hizmeti ikinci servise enjekte ettiğimde başarısız oluyor ve konsola hata atar.

Yani ne oluyor?

bir konsol günlüğüne aşağıdaki yazdırmalısınız çözümü çalışma: önceden

abcxyz 
xyzabc 

Teşekkür!

cevap

3

angularjs izin vermez dairesel bağımlılıkların enjeksiyonu.tarafından Circular Dependency in constructors and Dependency Injection Daha fazla bilgi için,

      +---------+ 
+---------+    | B | 
| A |<-------------|   | 
|   |    |   | 
|   | +---+  |   | 
|   |--->| C |<----|   | 
|   | +---+  +---------+ 
+---------+ 

:

+---------+  +---------+ 
| A |<-----| B  | 
|   |  | | +-+ | 
|   |  | +->|C| | 
|   |------+---->| | | 
|   |  |  +-+ | 
+---------+  +---------+ 

Ve üçüncü hizmetine ayıklanması:

Miško Hevery, angularjs yazarlarından biri, ortak öğeleri bulma önerir Miško Hevery.

3

yüzden mümkün

sayılı Dairesel bağımlılıklar açısal en DI tarafından çözülmediği bir Açısal uzmanı değilim. Aynı zamanda, onu destekleyen sistemler bile, oldukça yaygındır. commonjs https://nodejs.org/docs/latest/api/modules.html#modules_cycles, bir süreliğine boş bir nesne verecektir.

Çözüm

bir içine iki hizmet birleştirerek düşünün. Belirli maddeleri (örneğin basit işlevler vb.), Çok fazla hale gelirse, birleştirilmiş hizmetten taşıyabilirsiniz.

2

Bazarat tarafından önerilen çözümlere katılıyorum.

@Injectable() 
export class FirstService { 

    foo: string = 'abc'; 
    secondService: SecondService 

    constructor() { 
    //this.foo = this.foo + this.secondService.bar; 
    } 

    init(secondService:SecondService) { 
    this.foo = this.foo + secondService.bar; 
    } 
} 

Sonra oluşturmak:

Bir hizmet bağımlılığı gibi diğer hizmet vermeksizin bir örneğini oluşturmak için muktedir değiştirilmesi gereken gibi başka bir geçici çözüm DI dışında örneklerini başlatmak ve değer olarak bunları sağlamak olacaktır örnekleri imperatively ve değer olarak bunları sağlamak

let firstService = new FirstService(); 
let secondService = new SecondService(firstService); 

@Component({ 
    selector: 'my-app', 
    template: '<h1>Hello world!</h1>', 
    providers: [ 
    provide(FirstService, {useFactory:() => { 
     firstService.init(secondService); 
     return firstService; 
    }}), provide(SecondService, {useValue: secondService})] 
}) 
... 

Plunker example

+0

angular2'de 'dairesel bağımlılıklar' var mı? –

+2

Ne demek istediğinden emin değilim. "döngüsel bağımlılıklar", sınıflarla çalışır ancak DI, döngüsel bağımlılıkları olan sınıfları başlatamaz. –