2

私のアプリでは、いくつかのヘッダーを追加する独自の実装で Angular Http クラスを拡張しました。

export class Secure_Http extends Http {
    private getJwtUrl = environment.employerApiUrl + '/getJwt';
    private refreshJwtUrl = environment.employerApiUrl + '/refreshJwt';

    constructor(backend: ConnectionBackend, defaultOptions: RequestOptions, private storage: SessionStorageService) {
        super(backend, defaultOptions);
    }

次に、app.mobule.ts ファイルでこれを行ったので、基本バージョンの代わりに安全なバージョンが常に使用されます。

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    ....
  ],
  providers: [
    ....
    SessionStorageService,
    {
      provide: Http,
      useFactory: secureHttpFactory,
      deps: [XHRBackend, RequestOptions, SessionStorageService]
    }
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }

export function secureHttpFactory(backend: XHRBackend, options: RequestOptions, sessionStorage: SessionStorageService) {
    return new Secure_Http(backend, options, sessionStorage);
}

現在、私たちのサービスでは、標準のコンストラクター/DI アプローチを使用しています。

@Injectable()

export class MySecurityService {
    employerApiBaseUrl: string = environment.employerApiUrl;

    constructor(private _http: Http) { } //, private _secureHttp: Secure_Http

    getUser() : Observable<User> {
        this.log('getUser', 'getting the current user');

        var thisUrl = this.employerApiBaseUrl + '/jwt/userinfo';

        var searchParam = {
            jwt: this.getToken()
        };

        return this._http.post(thisUrl, searchParam)
            .map((response: Response) => this.extractGetUserResponse(response))
            .catch(this.handleError);
    }
}

ここで私の問題は、JWT を取得するために必要な関数が 1 つあるため、SecurityService は Secure_Http クラス/サービスも注入する必要があることです。

しかし、コンストラクターのパラメーターとして Secure_Http クラス/サービスを追加するとすぐに、エラーが発生しますNo provider for Secure_Http

したがって、次に考えることは、app.module.ts ファイルの providers セクションに Secure_Http を追加することです。これは、Http が Secure_Http を使用する必要があると指定した場所のすぐ隣にあります。しかし、それを行うとすぐに、エラーが発生しますNo provider for ConnectionBackend。向きを変えてプロバイダーに追加ConnectionBackendすると、@NgModule にエラーが表示されますType 'typeof ConnectionBackend' is not assignable to type provider

ここでどこが間違っていますか?Secure_Http クラスに直接アクセスする必要があるメソッドが 1 つだけあります。これは、ポスト呼び出しの 1 つのパラメーターである必要があるため必要です。パラメータがすでに渡されているため、Secure_Httpサービス/クラスから呼び出すことはできません...

4

1 に答える 1

3

明示的に注入したい場合はSecure_Http、それを提供する必要があります

{
  provide: Secure_Http,
  useFactory: secureHttpFactory,
  deps: [XHRBackend, RequestOptions, SessionStorageService]
},
{ provide: Http, useExisting: Secure_Http }

Secure_Httpこのようにして、両方が注射されることにつながります

constructor(private _http: Http) { } 
constructor(private _secureHttp: Secure_Http) {}

Httpしかし、あなたが(あなたの設定がそうするように)注入することがわかっているなら、Secure_httpあなたはただキャストすることができます

private _http: SecureHttp;
constructor(http: Http) { 
  this._http = http as Secure_Http;
}
于 2017-03-30T15:36:06.830 に答える