Я разрабатываю приложение 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
и один для самого приложения.
Здесь мы можем видеть, что у нас есть два разных пути какхорошо для той же службы.
Это приводит к тому, что мой массив notifications
содержит не все мои уведомления, но уведомления для моего приложения в одном из экземпляров службы и уведомления для lib-controls
библиотека с другой стороны.
Я хотел бы иметь только один экземпляр службы во всем приложении, независимо от того, как служба импортируется (относительная или из библиотеки)
Я попытался поиграть с providers
в моем модуле, но ничего не изменилось.Хотя я думал, что providedIn: root
справится с задачей, но, похоже, это не сработает.