我正在开发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
库中包含通知的事实手。
无论服务如何导入(相对或从lib导入),我都只希望在整个应用程序中只有一个服务实例。
我尝试在模块中使用providers
,但并没有真正改变。尽管我认为providedIn: root
可以解决问题,但似乎不起作用。