Угловые услуги не так уж одиночны - PullRequest
0 голосов
/ 03 июля 2019

Я разрабатываю приложение Angular7.В моем проекте у меня есть несколько библиотек, некоторые из которых содержат службы.

Допустим, у меня есть служба с именем NotificatorService в библиотеке с именем lib-controls

import { Notifications } from './notifications.enum';
import { INotificationService } from './notification-service.interface';

@Injectable({
  providedIn: 'root'
})

//service in charge of notification handling
export class NotificatorService implements INotificationService {

    //notifications array
    notifications: Array<any> = new Array<any>();

    constructor() {
        console.log('init');
    }

    //when a notifaction is displayed
    notify(keyword: Notifications) {
        console.log(keyword);
        this.notifications.push(keyword);
    }
}

Все еще вВ моей библиотеке lib-controls есть несколько элементов управления, которые внедряют этот сервис, например, этот:

import { Notifications } from '../../../../notifications/notifications.enum';
import { NotificatorService } from '../../../../notifications/notificator.service';

@Component({
  selector: 'send-mail',
  templateUrl: './send-mail.component.html',
  styleUrls: ['./send-mail.component.css']
})

export class SendMailComponent {

    constructor(private _notificationService: NotificatorService) {

    }

    notifyMailState(keyword: Notification) {
         this._notificationService.notify(keyword);
    }
}

Теперь из моего компонента приложения я бы также хотел внедрить этот сервис для отправки уведомлений

import { NotificatorService } from 'lib-controls';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
  providers: [{ provide: SendMailAbstract, useClass: SendmailService }, { 
provide: SendUsbAbstract, useClass: SendUsbService }]
})

export class AppComponent implements AfterViewInit {

  constructor(
    private _notificatorService: NotificatorService) {
  }

  notify() {
    this._notificatorService.notify(<Notifications>('OFFLINE'));
  }
}

Обратите внимание, что импорт теперь не относительный путь, а нацелен на библиотеку напрямую.

Отсюда видно, что экземпляр службы создается дважды.Один для всех инъекций из lib-controls и один для самого приложения.

enter image description here

Здесь мы можем видеть, что у нас есть два разных пути какхорошо для той же службы.

Это приводит к тому, что мой массив notifications содержит не все мои уведомления, но уведомления для моего приложения в одном из экземпляров службы и уведомления для lib-controls библиотека с другой стороны.

Я хотел бы иметь только один экземпляр службы во всем приложении, независимо от того, как служба импортируется (относительная или из библиотеки)

Я попытался поиграть с providers в моем модуле, но ничего не изменилось.Хотя я думал, что providedIn: root справится с задачей, но, похоже, это не сработает.

...