【问题标题】:Angular2 - when both services requires each otherAngular2 - 当两种服务相互需要时
【发布时间】:2016-07-14 07:42:30
【问题描述】:

这是我的主要组件(根组​​件)。这里我声明了一些应该可以通过整个应用程序访问的服务。

@Component({
    ...
    providers: [
      WebSocketService,
      ...
      AuthenticationService,
    ]
})
export class MainComponent { ... }

而且 - 确保每个人都能理解 - 我正在做:

bootstrap(MainComponent, [...]);

WebSocketService 和 AuthenticationService 都用@Injectable()注解。一切都很好,直到我发现这两种服务都需要彼此。 AuthenticationService 需要 WebSocketService 与后端服务器通信,WebSocketService 需要 AuthenticationService 来检查用户是否登录等。

因此,我收到了该错误消息:

例外:无法解析所有参数 'AuthenticationService'(未定义)。确保所有参数 用 Inject 装饰或具有有效的类型注释,并且 'AuthenticationService' 用 Injectable 修饰。

这里是AuthenticationService的片段。 WebSocketService 看起来很相似。

@Injectable()
export class AuthenticationService implements OnInit {

    constructor(private webSocketService:WebSocketService) {
    }
    ...
}

我知道,对于这种情况(第三次服务等)有不同的甚至更好的解决方案,但这不是我的问题的重点。 我想知道是否有一种方法可以使用 Angular2 以我提出的类似方式将两个服务相互注入?

【问题讨论】:

  • 修复循环引用而不是使用 forwardRef 会更好。

标签: angular angular2-di


【解决方案1】:

更新 (未测试)

bootstrap(AppComponent, [
  provide(WebSocketService, {useFactory: () => {
    let as = new AuthenticationService();
    let ws = new WebSocketService(as);
    as.webSocketService = ws;
    return ws;
  }}),
  provide(AuthenticationService, {useFactory: {(ws) => {
    return ws.authenticationService;
    }, deps: [WebSocketService]);
  })
]);

原创 (仅适用于类型依赖,不适用于实例依赖)

循环引用需要使用forwardRef解析(需要从angular2/core导入

constructor(@Inject(forwardRef(() => WebSocketService)) private webSocketService:WebSocketService) {

【讨论】:

  • 其实我也不知道。如果您为收到错误消息的一个执行此操作,然后为另一个收到相同的错误消息,那么也执行此操作。另见blog.thoughtram.io/angular/2015/09/03/…
  • 这有点帮助,但现在我收到了EXCEPTION: Cannot instantiate cyclic dependency! (MainComponent -> AuthenticationService -> WebSocketService -> AuthenticationService)。但现在我知道问题出在哪里了。以前的错误对我来说很奇怪:)
  • 其实第二个想法,我不认为这是可能的。如果您创建的 A 类的实例需要注入 B 类的实例,而创建 B 需要 A 的实例,则您无法创建其中任何一个的实例。也许你想使用工厂。我会更新我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-16
  • 1970-01-01
  • 2021-05-30
  • 2014-08-04
  • 1970-01-01
  • 1970-01-01
  • 2017-06-27
相关资源
最近更新 更多