現在、以下のようなモジュール設定があります(抜粋)。
AppModule
RoutingModule
AuthRouteGuard
AuthModule
LoginFormComponent
AuthService
my AuthService
(ユーザー認証の処理を担当し、現在のユーザーが認証されているかどうかを判断する方法を提供する) を my のプロバイダーとして定義しましたAuthModule
。
// auth.module.ts - uses https://github.com/auth0/angular2-jwt
export function authHttpServiceFactory(http: Http, options: RequestOptions) {
return new AuthHttp(new AuthConfig({
tokenName: jwtLocalStorageKey
}), http, options);
}
export let authHttpServiceProvider = {
provide: AuthHttp,
useFactory: authHttpServiceFactory,
deps: [Http, RequestOptions]
};
@NgModule({
imports: [
CommonModule,
FormsModule,
ReactiveFormsModule
],
exports: [AuthComponent],
declarations: [AuthComponent, LoginComponent, RegisterComponent],
providers: [
AuthService,
authHttpServiceProvider
]
})
export class AuthModule { }
このサービスは兄弟内で問題なく使用できますLoginFormComponent
。ただし、クラスAuthService
内でを使用しようとすると、次のエラーが発生します。AuthRouteGuard
RoutingModule
Error: Invalid provider for the NgModule 'AuthModule' - only instances of Provider and Type are allowed, got: [?undefined?, ...]
内にAuthModule
インポートしましたRoutingModule
。上記のエラーAuthService
は、 が の依存関係として定義されるとすぐに発生しAuthRouteGuard
ます。
export class AuthRouteGuard implements CanActivate {
constructor(
private router: Router,
private authService: AuthService // Removing this injection removes the error
) {}
canActivate() {
// @todo: if not authenticated
this.router.navigate(['/login']);
return true;
}
}
ここで何が欠けていますか?また、コンストラクターにサービスを注入すると、その注入が削除されたときに発生しない無効なプロバイダーエラーが発生するのはなぜですか?
編集authHttpServiceProvider
-プロバイダーを完全に削除すると同じエラーが発生するため、AuthModule
モジュールは次のようになります。
@NgModule({
imports: [
CommonModule,
FormsModule,
ReactiveFormsModule
],
exports: [AuthComponent],
declarations: [AuthComponent, LoginComponent, RegisterComponent],
providers: [
AuthService
]
})
export class AuthModule { }