2017-06-18 15 views
2

新しいプロジェクトを開始して、私は私のサービスをいくつか受け取りました。Angular2:AuthGuardへのサービス注入により、他のサービスへの注入が中断される

  • TokenServiceは、トークンをチェックする
  • UserServiceの記事をUserServiceのを使用して、現在のユーザーを格納
  • のAuthServiceは
  • APIはHTTPヘッダを取得するためのAuthServiceを使用して、HTTPヘッダーを提供するために、TokenServiceとUserServiceのを使用しています

これらのサービスは私の最後のプロジェクトではうまくいきました。循環的な依存関係はないようです。

私の新しいプロジェクトでは、UserServiceも注入されるAuthGuardが必要でした。 AuthGuardのコンストラクタにUserServiceを追加すると、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 
) { 
    } 

ので:私はDefaultGuardにUserServiceのを注入するまで、すべてが動作します。 UserServiceをDefaultGuardに注入すると、TokenServiceの依存関係解決エラーが発生します。 AuthServiceをDefaultGuardに注入すると、ApiServiceなどの依存関係解決エラーが発生します。

何が問題なの?

更新 このように、サービスがインポートされたり挿入されたりする順序がこの問題に影響するようです。私はどのくらい正確にはわかりませんが。

答えて

1

私は私の特定の問題の解決策を見つけた:

全体のDIの混乱がUserServiceHttpの注入によって引き起こされました。そこでUserServiceCurrentUserServiceに分割し、現在のユーザー(AuthServiceなどで必要なもの)とUserServiceHttp)を保存して、BEからユーザーを取得するだけです。

これは明らかに問題の原因を理解していませんが(私の最後のプロジェクトではうまくいきました)、私のサービスがより良く分かれています。

私はアプリを構築するためにng2-admin templateを使用していることに言及する価値があります。たぶんバックグラウンドのどこかに他の依存関係があったかもしれません。

関連する問題