无法解析所有参数 - 导出共享服务时出现Angular DI问题

时间:2017-08-04 23:35:15

标签: angular typescript dependency-injection ecmascript-6 angular2-services

我想避免将每个服务都导入到我的所有Angular 4组件中,所以我创建了这样的东西

import * as UtilityService from '../../services/utility.service';

而不是这样做

import { AppStateService, InternalStateType } from '../services/appstate.service';
import { Logging } from '../services/utility.service';
import { AuthenticationService } from '../services/authentication.service';
import { DataService } from '../services/data.service';
import { Utils } from '../services/utility.service';
import { RouteProtectionService } from '../services/route-protection.service';
import { UrlManagementService } from '../services/url-managing.service';

现在,我可以通过引用UtilityService.Classname,即UtilityService.AppStateUtilityService.Authentication等来访问任何组件中的所有类。

 constructor(
  public appState: UtilityService.AppState,
  public utilities: UtilityService.Utils,
  public dataService: UtilityService.Data,
  private appInsightsService: UtilityService.AppInsights,
  private titleService: UtilityService.Titles) {
 }

然后在utility.service.ts里面,我有这个

export { AppState, InternalStateType } from './appstate.service';
export { Authentication } from './authentication.service';
export { Data } from './data.service';
export { RouteProtection } from './route-protection.service';
export { UrlManagement } from './url-managing.service';
export { AppInsightsService } from '@markpieszak/ng-application-insights';
export { Title } from '@angular/platform-browser';

它在打字稿中编译得很好,但在运行应用程序时,有角度抱怨

 Error: Can't resolve all parameters for Authentication: ([object Object], [object Object], ?, ?, ?).

我已经在AppModule中为每个提供程序指定了提供程序,并且在我正常导入类时它可以正常工作。那么为什么我不能导入一桶类并在Angular依赖注入中使用它们呢?

2 个答案:

答案 0 :(得分:1)

通常由于循环依赖性而出现此错误。如果没有所有源代码信息,很难识别服务,这实际上会导致循环依赖性问题

我建议将服务逐个添加到构造函数中,并确定导致此错误的服务并解决它。

如果您无法识别问题或需要循环依赖,请手动解决依赖关系,如下所示

import { Injector } from '@angular/core';
constructor( private injector: Injector) {
    this.myService = this.injector.get(MyService);
  }

import { ReflectiveInjector } from '@angular/core';
 constructor() {

       var injector= ReflectiveInjector.resolveAndCreate([MyService]);
       let myservice=injector.get(MyService);
     }

您可以从以下链接了解这些注射器。根据您的需要使用注射器或反射注射器。

Difference between Reflective Injector and Injector in Angular

答案 1 :(得分:1)

如果您在网络浏览器中打开开发者控制台,您可能会看到如下错误:

  

(SystemJS)遇到未定义的提供者!通常这意味着您有一个循环依赖(可能是由于使用'桶' index.ts文件引起的。)

The Angular glossary称这种类型的重新导出“桶”。

  

将多个ES2015模块的导出汇总到一个方便的ES2015模块中的方法。

那桶'是您用于重新导出模块的技术。不幸的是,它可能导致循环依赖。

解决方案:删除循环依赖项,如associated GitHub issue here says