角度服务不是那么单身

时间:2019-07-03 09:45:54

标签: angular angular7 angular-services angular-library

我正在开发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库中包含通知的事实手。

无论服务如何导入(相对或从lib导入),我都只希望在整个应用程序中只有一个服务实例。

我尝试在模块中使用providers,但并没有真正改变。尽管我认为providedIn: root可以解决问题,但似乎不起作用。

0 个答案:

没有答案