2017-06-18 106 views
2

开始一个新项目,我带走了一些我的服务。Angular2:服务注入AuthGuard中断注入其他服务

  • TokenService使用UserService检查令牌,
  • UserService职位和存储当前用户,
  • AuthService使用TokenService和UserService提供的HTTP头
  • API使用AuthService得到HTTP头

这些服务在我上一个项目中运行良好,似乎没有任何循环依赖关系。

在我的新项目中,我需要一个AuthGuard,它也可以注入UserService。只要我将UserService添加到AuthGuard的构造函数中,Angular就无法将UserService解析为其他服务中的依赖项。 没有注入AuthGuard,一切正常。

因为这似乎不仅发生在UserService上,而且还发生在AuthService上,所以我猜测我的问题不是来自服务,而是来自提供方式。

app.module.ts

import { App } from './app.component'; 
import { AppState, InternalStateType } from './app.service'; 
import { GlobalState } from './global.state'; 
import { NgaModule } from './theme/nga.module'; 
import { PagesModule } from './pages/pages.module'; 
import {UserService} from "./services/user.service"; 
import {DefaultGuard} from "./pages/default.guard"; 
import {AuthService} from "./services/auth.service"; 
import {TokenService} from "./services/token.service"; 
import {Api} from "./services/api.service"; 

// Application wide providers 
const APP_PROVIDERS = [ 
    AppState, 
    GlobalState, 
    UserService, 
    DefaultGuard, 
    AuthService, 
    TokenService, 
    Api 
]; 

@NgModule({ 
    bootstrap: [App], 
    declarations: [ 
    App, 
    ], 
    entryComponents: [ 
    ], 
    imports: [ // import Angular's modules 
    BrowserModule, 
    HttpModule, 
    RouterModule, 
    FormsModule, 
    ReactiveFormsModule, 
    NgaModule.forRoot(), 
    NgbModule.forRoot(), 
    PagesModule, 
    routing 
    ], 
    providers: [ // expose our Services and Providers into Angular's dependency injection 
    APP_PROVIDERS 
    ] 
}) 

export class AppModule { 

    constructor(public appState: AppState) { 
    } 
} 

pages.module.ts

import { NgModule }  from '@angular/core'; 
import { CommonModule } from '@angular/common'; 
import { routing }  from './pages.routing'; 
import { NgaModule } from '../theme/nga.module'; 
import { AppTranslationModule } from '../app.translation.module'; 
import { Pages } from './pages.component'; 

@NgModule({ 
    imports: [CommonModule, AppTranslationModule, NgaModule, routing], 
    declarations: [Pages], 
}) 
export class PagesModule { 
} 

的AuthGuard default.guard.ts在路由器属于页面上使用.module.ts

我的服务10只

依赖条件:

user.service.ts

constructor(
    private http: Http, 
) { 
    } 

api.service.ts

constructor(
    private http: Http, 
    private auth: AuthService, 
) { 
    } 

auth.service.ts

constructor(
    public userService: UserService, 
    private tokenService: TokenService, 
    private http: Http, 
) {} 

token.service.ts

constructor(
    public userService: UserService 
) { 
    } 

因此,要回顾:一切正常,直到我注入UserService到DefaultGuard。 将UserService注入到DefaultGuard中导致TokenService中存在依赖性解析错误。 将AuthService注入到DefaultGuard中导致ApiService中的依赖性解析错误等。

关于这里有什么错误的任何想法?

更新 因此,看起来服务导入和/或注入的顺序在这个问题中起着作用。虽然我不确定如何。

回答

1

我发现我的特殊问题的解决方案:

整个DI混乱中造成的Http注入到UserService。所以我把UserService分成CurrentUserService,它只关心存储当前用户(这就是AuthService等所需要的)和UserService,它使用Http来发布并从BE获取用户。

这显然是一个更好,更分散的我的服务组织,但我仍然不明白究竟是什么导致了问题(它在我最后一个项目中起作用)。

可能值得一提的是,我使用ng2-admin template来构建应用程序。也许在后台某处还有其他依赖关系。