2017-02-20 3 views
2

angular1では、私たちはしばしば、インスタンスではなくクラスを注入するためにfactoryを使用しました。 angular2では、私は同じことを行うことができます。DIをクラスインジェクションに使用する点はありますか?

{provide: MyClass, useFactory:() => { return MyClass }} 

... 
constructor(MyClass) { 
    let instance = new MyClass(); 
} 

はしかし、私は、これはJSモジュールの不在によって正当化されたことを読んで覚えています。 ES6モジュールを使用したので、クラス注入のためにDIを使用する必要があるかどうか疑問に思っていますか?クラスを取得するために角度DIを使用しないライブラリが多数ありますが、importステートメントでアクセスします。

答えて

1
{provide: MyClass, useFactory:() => { return MyClass }} 

{provide: MyClass, useValue: MyClass } 

、本質的に同じものです。はい、手動でインスタンス化されるはずのクラスに対してDIを使用するのは理にかなっています。

それはDIがJS(ES.Next)で実行されて何の問題作成しません:

constructor(@Inject(MyClass) MyClass) { 
    this.MyClass = new MyClass; 
} 

をしかし、タイプが正しく指定されなければならないので、活字体で使用するために以下の便利なことがあります

constructor(@Inject(MyClass) MyClass: typeof MyClass) { 
    this.MyClass = new MyClass; 
} 

プロバイダとして使用すると、元のコードにパッチを適用することなくいつでも機能を置き換えたり拡張したりすることができます。これはサードパーティ製のライブラリの優れた特性です。

そして、より良いテスト容易性を提供します。MyClassは、スタブクラスまたはスパイ関数に置き換えることができます。 DIが含まれていない場合、これはテストをより複雑にし、インポートレベルでDIを実装する必要があります。 rewire-webpackとなります。

+0

'{provide:MyClass、useValue:MyClass}'は '{provide:MyClass、useClass:MyClass}'または 'MyClass'おそらく '{提供:MyClass、useFactory :()=> {MyClassを返す}}は' {提供:MyClass、useFactory:()=> {新しいMyClass()}}を返すことを意味していました。 ' –

+0

@GünterZöchbauer、nope 、彼の例は正しいです、彼はクラスではなく、インスタンスを提供したい –

+0

@GünterZöchbauerそれをする必要がありますか? useValueの場合、クラスが注入されます。 useClassの場合、クラスインスタンスが注入されます。 – estus

1

*.tsファイル内で型を指定するには、TypeScriptのインポートステートメントを使用する必要があります。これはDIとはまったく異なり、DIには実際には関係しません。ただし、そのようなインポートされた型は依存関係を要求するDIプロバイダのキーとして使用できます。

new MyClass()でクラスインスタンスを作成することができます。

あなたのクラスは

DIを使用して
class MyClass { 
    constructor(this.http:Http) {} 
} 

ようAngulars HttpModuleからHttpのような依存関係を持っている場合は、DIによって作成MyClassインスタンスとも自動的に渡されたHttpパラメータを取得するために便利です。

DI(Inversion of Control)は、結果のクラスが密接に結合されていないため、テストを容易にする一般的なプログラミングパターンです。

DIはhiearchicalであり、特定のスコープを持つインスタンスを共有することが容易になります(例えばコンポーネントインスタンスと、それは子供たちのすべて)

+0

ありがとう、_これはDIとはまったく異なり、DI_とはまったく関係ありません.-まあ、anglular1では、これはDIをクラスに挿入する一般的なパターンでした。あなたの答えから理解できるように、クラスに依存関係がない場合は、DIを使用する意味はありません。 –

+0

それは逆もまた同じです。他のクラスがあなたのクラスに依存する場合は、DIも便利です。異なるコンポーネント、ディレクティブ、パイプ、または他のサービスとインスタンスを共有したい場合、DIは特定のインスタンスが注入されるように気を配るので非常に便利です。注入されたクラスは、Angular1からの '$ scope'を置き換えます。 https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#bidirectional-serviceおよびhttps://angular.io/docs/ts/latest/cookbook/dependency-injectionも参照してください。 html –

+0

ええ、ありがとう。私の質問をはっきりと表明したかどうかは分かりませんが、あなたがインスタンスについて話しているので、私はクラスについて取っています。 _InjectedクラスはAngular1_の$ scopeを置き換えます - これもangle1のパターンを使用しました:) –

関連する問題