Методы жизненного цикла услуг в angular2

Возможно ли иметь крючки жизненного цикла для службы, которая аннотируется с помощью @Injectable()?

Я бы ожидал, что крючки жизненного цикла будут вызваны на такую ​​услугу, но я оказался неправ, кажется, работает только на @Component. Есть ли способ получить информацию в службе, когда инъекция зависимости создает/уничтожает службу?

import {Component, Injectable, OnInit, OnDestroy} from 'angular2/core';

@Injectable()
export class SampleService implements OnInit, OnDestroy {
    ngOnInit() {
        console.log("OnInit")
    }
    ngOnDestroy() {
        console.log("OnDestroy")
    }
}

@Component({
  selector: "sample",
  template: "<div>Sample Component</div>",
  providers: [ SampleService ]
})
export class SampleComponent {
  constructor() { private _sampleService: SampleService }
}

Ответ 1

Инъекции - это просто нормальные классы (обычные объекты), и поэтому они не имеют специального жизненного цикла.

Когда объект вашего класса создается, вызывается конструктор классов, поэтому это будет ваш "OnInit". Что касается разрушения, то служба действительно не уничтожается. Единственное, что может случиться, это то, что он получает сбор мусора, когда больше нет ссылки на него, что, вероятно, произойдет после того, как инжекторы зависимостей будут удалены сами. Но вы вообще не контролируете его, и в JavaScript нет концепции деконструктора.

@Injectable()
export class SampleService {
    constructor() {
        console.log('Sample service is created');
    }
}

Ответ 2

Перехваты жизненного цикла ngOn *, которые вы показываете, предназначены только для компонентов. Вы можете ввести еще одну услугу (назовите ее TrackServiceLifecycles) в SampleService и создать конструктор SampleService() на другой службе, чтобы сообщить ему, что он был создан. Но я не могу придумать способ оповестить другую службу, когда SampleService будет уничтожен (сбор мусора).

См. также деструктор класса ECMAScript 6