2017-05-24 24 views
1

私は基本クラスから継承する複数のクラスを持っています。クラスの継承とDI

サブクラスがロジックに加えてHTTP呼び出しを発行できるように、ベースクラスにはHttpインスタンスが含まれている必要があります。問題は、サブクラスがコンストラクタ関数からスーパーメソッドを呼び出す必要がありますが、HTTPインスタンスを下から上に渡したくないということです。

アイデア?

export abstract class AuthBaseService { 

    constructor(protected http: Http) { 

    } 

    public abstract login(credentials); 

    public abstract logout(); 
} 



export class FacebookProviderAuthService extends AuthBaseService { 

    constructor(private facebookAuth: Auth) { 
    // **PROBLEM : I MUST CALL SUPER HERE** 
    } 

    // Login & Logout impl. 
} 

答えて

1

私はあなたが何を意味するかはわかりません。 AuthBaseServiceクラスは抽象クラスなので、インスタンスを作成することはできません。 DIフレームワークはサブクラスのインスタンスにしかアクセスできないため、すべての依存関係をサブクラスから注入する必要があります。これは本当に依存性注入のアイデアを壊すものではなく、私が見たほとんどのDIフレームワークでサポートされています。 FacebookProviderAuthServiceはHttpインスタンスに依存しているので、渡されることを期待しています。

もちろん、Httpインスタンスをスーパークラスコンストラクタにインスタンス化するだけですが、それは間違いなく依存関係の逆転を壊しています。私は、問題が何であるか正確にはわからないと思う。私の目では、これは全く問題のようには見えません。

このように考える。 FacebookProviderAuthServiceを単体テストしたいとします。コンストラクタの一部としてHttp依存関係を取らない場合、どうやってそれを嘲笑することができますか? FacebookProviderAuthServiceは、それらの依存関係のいくつかが基本抽象クラスから来たとしても、その依存関係を明示する必要があります。

0

これはどのように行う必要があります。あなたがどこかでそれを渡さなかった場合、ベースクラスはどこからHttpインスタンスを取得しますか?それが継承の仕組みです。

あなたはApiServiceまたは何か別のサービスを作成することができ、そこにpost/get要求を送信し、それぞれに認証トークンを添付する機能を追加することができます。次に、それを必要とするサービスクラスに挿入します。