2016-03-20 7 views
1

私はAngular 2.0 docs依存性反転をと読んできました。私はまたonline examplesも探しています。角度2.0 DIは抽象化に依存できますか?

私の理解では、@injectableデコレータは、emitDecoratorMetadataフラグを持つTypeScriptコンパイラを使用して、依存関係を解決するために使用されるメタデータを作成します。例えば、以下のクラスを取る:

enter image description here

活字体のコンパイラはDataServiceクラスはタイプHttpとコンストラクタの引数を持つメタデータを経由して宣言するemitDecoratorMetadataを使用しています。

我々はそれが@Appまたは@ComponentデコレータでProvidesオプションを使用して、いくつかのコンポーネントに注入する必要があることを示すことができ@Injectableを使用して、クラスの依存関係を宣言した後。

enter image description here

私はemitDecoratorMetadataの行動を認識していると私はそれがインターフェイスのためのメタデータを発することができないことを知っています。したがって、私はIHttp代わりのHttpに依存しないことを前提としています

enter image description here

は私の仮定が正しいですか? “Depend upon Abstractions. Do not depend upon concretions.”に頼ることはできますか、それは現時点では不可能なことですか?私はemitDecoratorMetadataがシリアル化インターフェイスを使用できるようになるとすぐに修正されると考えています。

答えて

3

現在、プロバイダのキーとしてタイプ、文字列名、またはOpaqueTokenが必要です。
実行時に情報が利用できないため、インターフェイスはサポートされていません。これが追加されると、DIがそれらをサポートすると確信しています(既にDartでサポートされています)。

+0

文字列を使用する場合、文字列を実際の型にマップする方法と場所はどこですか? –

+3

'(' someName '、{useClass:Http}) ')'コンストラクタ '@Inject(' someName ')http:IHttp'で' bootstrap() 'またはコンポーネントの型をプロバイダに追加するのではなく、 –

1

TypeScriptを使用している場合は、解決策があります。

私はAngular 2.0を使用していませんが、私たちは類似のDIライブラリ(intakejs)を開発しました。問題は、TSコンパイラがクラスのためだけに反射メタデータを出すことであり、インターフェースのためではない(彼らは "オブジェクト"のように扱われる)。

これらの機能をさらに追加したいと思っていますが、今日はTypeScriptのdeclaration merging機能に基づいたハックを使用しています。アイデアは、あなたがインターフェイスを宣言し、このような文字列または他のいくつかのランタイムIDでそれをマージすることができるということです。

export interface IMyInjectable { 
    foo(): string; 
} 
export const IMyInjectable = 'MyInjectable'; 

は、あなたがそのインターフェイスの実装を持っていると仮定しましょう:

@Injectable('MyInjectable') 
class MyInjectable implements IMyInjectable { 
    foo(): string { return 'hello' } 
} 

次に、あなたが依存することができますあなたの消費者階級の抽象化:

class MyConsumer { 

    @Inject(IMyInjectable) 
    private myInjectable: IMyInjectable; 

} 

この小さなトリックがあなたの問題を解決することを望みます。

+0

興味深いです。 'Injectable'デコレータは' @Injectable( 'MyInjectable') 'のようなパラメータをサポートしていませんが、https://github.com/angular/angular/blob/758efba34bb347991991e780ed31130e642e65ab/modules/angular2/src/core/di/decorators.dart #L23。これは必要ですか? –

+0

私が前に述べたように、私はAngular DIを実際に使ったことはありません。しかし、 '@ Injectable'はランタイムIDをクラスの名前で作成するので、その名前でインターフェースをマージすることができます。 – koroandr

+0

あなたの考えに感謝します。 –

関連する問題