【问题标题】:Import Angular service1 into service2将 Angular 服务 1 导入服务 2
【发布时间】:2018-08-01 00:40:21
【问题描述】:

这是一个 Angular 6 和 Firestore 应用程序。我正在尝试将 service1 导入 service2 并收到以下错误。

compiler.js Uncaught Error: Can't resolve all parameters for Service1

我已阅读此 Medium article 和此 stackoverflow 帖子,两者都没有提供见解。

这是我的代码。

首先,我在app.module.ts 中导入并列出这两个服务作为提供者

#### app.module.ts ####

import { AuthenticationService } from './authentication.service';
import { UserService } from './user.service';

@NgModule({
  ...
  providers: [
    AuthenticationService,
    UserService
  ]
  ...
})

而service1AuthenticationService就是这个

#### authentication.service.ts ####

import { Injectable } from '@angular/core';
import { AngularFireAuth } from 'angularfire2/auth';
import * as firebase from 'firebase/app';
import { Router } from '@angular/router';
import { Observable } from 'rxjs';
import { User } from './models/user.model';
import { UserService } from './user.service';

@Injectable({
  providedIn: 'root'
})

export class AuthenticationService {
  user: Observable<firebase.User>;

  constructor(private afAuth: AngularFireAuth,
              private router: Router,
              public userService: UserService ) {
                this.user = afAuth.authState;
              }
}

当我将 service1 AuthenticationService 添加到 service2 UserService 的构造函数中时,我得到上面列出的编译器错误。

#### user.service.ts ####

import { Injectable } from '@angular/core';
import * as firebase from 'firebase/app';
import {
  AngularFirestore,
  AngularFirestoreDocument,
  AngularFirestoreCollection
} from 'angularfire2/firestore';
import { Observable } from 'rxjs';
import { User } from './models/user.model';
import { AuthenticationService } from './authentication.service';

@Injectable({
  providedIn: 'root',
})

export class UserService {
  usersCollection: AngularFirestoreCollection<User>;
  users: Observable<User[]>;
  username;

  constructor(private afs: AngularFirestore, 
              private authserv: AuthenticationService) {
    this.usersCollection = this.afs.collection('users');
    this.users = this.usersCollection.valueChanges();

    this.authserv.user.subscribe(user => {
      if (user != null) {
        console.log('Id is: ' + user.uid);
      }
    });
  }
}

我是否在某处遗漏了一些代码?谢谢你。

【问题讨论】:

  • 这是不可能的:您需要 UserService 来创建 AuthenticationService,但要创建 UserService,您需要 AuthenticationService。所以这是一个先有鸡还是先有蛋的问题。重构您的服务以避免这种循环依赖。
  • @JBNizet 但是,一个依赖项是可以的,对吗? AuthServ 可以用 UserServ 构建,是吗?但它也不能反过来工作吗?
  • 您可以让 UserService 依赖于 AuthenticationService,或者 AuthenticationService 依赖于 UserService,但不能同时依赖于两者,因为这会引入循环依赖:如果不创建另一个服务,就无法创建另一个服务。
  • 那是我的问题的答案。谢谢。

标签: angular typescript firebase dependency-injection


【解决方案1】:

如上面的 cmets 所示,不可能两者兼得

  • 使用service2 作为依赖构造service1
  • AND 构造 service2 和 service1 作为依赖项

你可以做一个或另一个,但不能同时做。

【讨论】:

    猜你喜欢
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-15
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多