2016-03-02 5 views
6

Мне нужно использовать несколько экземпляров одной службы.Как использовать поставщиков услуг?

Обычно, когда я использую один экземпляр этой службы в компоненте, я пишу так:

@Component({ 
    selector: 'one-component', 
    providers: [provide("token1", {useClass: Service})], 
    template: ` 
     <h1>App</h1> 
    ` 
}) 
export class OneComponent { 
    constructor(@Inject('token1') service:Service) {} 
} 

Но теперь мне нужно использовать эту услугу в Service2, я пишу так:

export class Service2 { 
    constructor(@Inject('token1') service:Service) {} 
} 

Как вы знаете, это показывает:

нет поставщика

Потому что Service2 не имеет providers: [provide("token1", {useClass: Service})]. Но где я могу добавить его, так как он не имеет @Component?

Благодаря

+0

где вы пользуетесь услугами Service2? – Ludohen

+0

@ Ludohen спасибо за помощь, я использую Service2 в компоненте. –

+0

Тогда то, что вы пытаетесь сделать, определенно возможно – Ludohen

ответ

2

К сожалению настройка служб таким образом, в настоящее время не поддерживается, и в настоящее время нет никаких планов, чтобы добавить поддержку https://github.com/angular/angular/issues/5622

+0

спасибо, что дайте мне знать! –

0

Я не думаю, что ответ Гюнтер является полностью правильным здесь. Если я правильно понял проблему Хунбо Мяо, это может быть «легко» достигнуто. Если вы хотите получить новый экземпляр службы при каждой инъекции, вам нужно будет использовать useFactory вместо useClass конфигурации поставщика.

Тогда, если вы получаете сообщение об ошибке не поставщика для "token1" в Service2 это потому, что он не настроен на правой форсунки, брат, сестра или родитель OneComponent ... где Service2 впрыскивается.

Edit:

Для этой работы вы должны определить ваш Service и Service2 поставщика в корневой компонент (например). В этом случае все будут иметь один и тот же экземпляр служб.

Если вы хотите иметь разные экземпляры в каждом компоненте, то определите поставщиков на уровне компонентов, где используются службы.

@Component({ 
    providers: [Service, Service2], 
    // Other config props 
}) 
export class RootComponent { 
} 

@Component({ 
    // Config props 
}) 
export class OneComponent { 
    constructor(public service: Service) {} 
    methodx() { 
    this.service... 
    } 
} 

@Component({ 
    // Config props 
}) 
export class TwoComponent { 
    constructor(public service: Service2) {} 
    methodx() { 
    this.service... 
    } 
} 

@Injectable() 
export class Service2 { 
    constructor(public service: Service) { 
    } 
} 

Использование @Inject('StringToken') не самое лучшее, что вы делаете, и не рекомендуемым способом. Вместо этого используйте токен типа (как это сделано в коде выше).

Ресурсы:

+0

спасибо, я скоро проведу проверку! –

+0

На основе вашего кода и того, что я хочу, у меня есть еще один «трикомпонент», который также использует «Сервис», и я хочу, чтобы «OneComponent» и «ThreeComponent» использовали разные экземпляры «Сервис». Вот почему я добавляю токен при использовании 'Сервис'. Тогда в 'Service2' у меня нет возможности использовать' провайдеров' для 'Service'. –

+0

'Service2' не нуждается ни в чем особенном, поставщики определены выше в дереве инжектора – Ludohen

0

Я исправил эту ошибку (с помощью сервиса B в сервис A), объявив две службы в app.module.ts «s поставщиков массива ,

@NgModule({ 
    declarations: [...], 
    imports:  [...], 
    providers: [ 
     ServiceA, 
     ServiceB, 
    ], 
    bootstrap: [...], 
}) 
Смежные вопросы